将文件保存在Git仓库中,但不跟踪更改

gor*_*ive 274 git

我在CodeIgniter站点中有几个文件,我希望在repo中有这些文件但不跟踪任何更改.

例如,我将此框架的新安装部署到新客户端,我希望下载以下文件(它们具有默认值CHANGEME),我只需要对此客户端进行特定更改(数据库凭据,电子邮件地址信息,自定义CSS).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css
Run Code Online (Sandbox Code Playgroud)

目前如果我跑

git clone git@github.com:user123/myRepo.git httpdocs
Run Code Online (Sandbox Code Playgroud)

然后编辑上面的文件,一切都很棒.直到我发布修补程序或补丁并运行git pull.然后我的所有更改都会被覆盖.

nas*_*han 573

git有一个不同的解决方案来做到这一点.首先更改您不想跟踪的文件,然后使用以下命令:

git update-index --assume-unchanged FILE_NAME
Run Code Online (Sandbox Code Playgroud)

如果要再次跟踪更改,请使用以下命令:

git update-index --no-assume-unchanged FILE_NAME
Run Code Online (Sandbox Code Playgroud)

git-update-index文档

  • 读取它的信息,我认为`--skip-worktree`选项比`--assume-unchanged`更适合这个工作. (36认同)
  • 根据Junio Hamano(Git的维护者):"假设 - 不变不应该被滥用于忽略机制.[...] Git不承诺Git将始终认为这些路径是未经修改的 - 如果Git可以确定标记为假设未更改的路径而不会产生额外的lstat(2)成本,它保留报告路径已被修改的权限(因此,"git commit -a"可以自由提交更改)." 换句话说,假设 - 不变只是针对本地性能问题.如果Git可以确定那些文件以更轻的方式改变了,它就会. (30认同)
  • --skip-worktree确实是更好的选择.更多信息:/sf/ask/954159461/# (23认同)
  • 是的,这应该是"接受的答案".为我工作. (7认同)

Ant*_*ony 59

从另一个答案的评论中得出答案:

$ git update-index --skip-worktree FILENAME

看起来比一个更好的选择 --assume-unchanged

关于此更多内容可以在这里阅读:Git - '假设未更改'和'跳过工作树'之间的区别

  • [文档](https://git-scm.com/docs/git-update-index#_notes) 说这是一个坏主意。“用户经常尝试使用假设未更改和跳过工作树位来告诉 Git 忽略对跟踪文件的更改。这不会按预期工作,因为 Git 在执行某些操作时仍可能根据索引检查工作树文件。一般来说,Git 不提供忽略跟踪文件更改的方法,因此建议使用替代解决方案。” (4认同)
  • 谢谢。另外:[medium.com/@igloude/git-skip-worktree-and-how-i-us-to-hate-config-files](https://medium.com/@igloude/git-skip-worktree-以及我如何讨厌配置文件(e84a44a8c859) (2认同)

sup*_*ggy 57

对于我的Code Igniter项目,我在repo中保留了database.php.exampleconfig.php.example.

然后我将config.phpapplications/config/database.php添加.gitignore文件中.

所以,最后,当我部署时,我可以复制.example文件(到config.php和database.php),自定义它们,它们不会被GIT跟踪.

  • 很好的解决方案,但我认为nasirkhan的答案是最好的. (12认同)
  • 我不同意前两个评论。这样,更新“默认”值变得更加容易,而不必检出它们并将您的本地配置复制到其他位置以将其放回去。而且,它适用于所有存储库,因此您不必进行任何重复的存储库更改。 (3认同)
  • 如果它在 gitignore 中,为什么它会再次开始跟踪更改 (2认同)

hou*_*anb 7

从 git 版本 2.25.1 开始,推荐的方法是跟踪存储库中文件的模板,将它们复制到新文件中并在本地修改它们(忽略 中的新文件名.gitignore)(来自此处):

用户经常尝试使用假设未更改和跳过工作树位来告诉 Git 忽略对被跟踪文件的更改。这不会按预期工作,因为在执行某些操作时,Git 可能仍会根据索引检查工作树文件。通常,Git 不提供忽略跟踪文件更改的方法,因此建议使用替代解决方案。

例如,如果您要更改的文件是某种配置文件,则存储库可以包含一个示例配置文件,然后可以将其复制到忽略的名称中并进行修改。存储库甚至可以包含一个脚本来将示例文件视为模板,自动修改和复制它。