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


305

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

例如,我将这个框架的新安装部署到新客户端,我希望下载以下文件(它们的默认值是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

目前,如果我跑步

git clone git@github.com:user123/myRepo.git httpdocs

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





您可以忽略客户端凭证/配置文件,如果安装回购协议时缺少这些文件,则程序可以构建默认文件吗?
MatthewG

Answers:


617

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

git update-index --assume-unchanged FILE_NAME

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

git update-index --no-assume-unchanged FILE_NAME

git-update-index文档


我做了你说的,但是git status不断告诉文件已被修改
rraallvv 2013年

7
是的,这应该是“可接受的答案”。为我工作。
joshmcode 2015年

34
根据Junio Hamano(Git的维护者)的说法:“不应将假设不变的机制用于忽略机制。[...] Git并不保证Git始终会认为这些路径未修改-如果Git可以确定标记为假定不变的路径已更改,而不会产生额外的lstat(2)费用,它保留报告该路径已被修改的权利(因此,“ git commit -a”可以自由地提交更改)。” 换句话说,假设不变只是针对本地性能问题。如果Git可以确定这些文件的更改方式较轻,那么它将进行更改。
亚历杭德罗·加西亚·伊格莱西亚斯

41
阅读相关信息,我认为该--skip-worktree选项比更加适合此工作--assume-unchanged
PJSCopeland '16

26
--skip-worktree确实是更好的选择。更多信息:stackoverflow.com/questions/13630849/…–
Customizer

80

要将答案从另一个答案的注释中拉出:

$ git update-index --skip-worktree FILENAME

似乎是比以下更好的选择 --assume-unchanged

可以在此处了解更多信息:Git-“假定不变”和“跳过工作树”之间的区别



当我这样做然后尝试更改分支时,我得到“以下未跟踪的工作树文件将被签出覆盖...请在切换分支之前移动或删除它们”。任何想法如何避免?
Patrick Szalapski '19

通过@aexl引用的文章已经转移到compiledsuccessfully.dev/git-skip-worktree
安德鲁·基顿

1
文档说,这是一个坏主意。“用户经常尝试使用未更改的假设和skip-worktree位来告诉Git忽略对跟踪文件的更改。这无法按预期进行,因为在执行某些操作时,Git仍会根据索引检查工作树文件。通常,Git不会提供忽略跟踪文件更改的方法,因此建议使用替代解决方案。”
柯蒂斯·布莱克韦尔

58

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

然后,将config.phpapplications / config / database.php添加.gitignore文件。

因此,最后,当我部署时,我可以将.example文件复制到config.php和database.php中,对其进行自定义,并且它们不会被GIT跟踪。


12
好的解决方案,但我认为nasirkhan的答案是最好的。
wordforthewise

这不是一个好的解决方案。如果您刷新了git索引,那么您将在不需要时开始跟踪更改。有关正确方法,请参见@nasirkhans答案。
Brian Melton-Grace-MSFT 2015年

3
我不同意前面的两个评论。这样,更新“默认”值变得更加容易,而不必检出它们并将您的本地配置复制到其他地方以将其放回去。而且,它适用于所有存储库,因此您不必进行任何重复的存储库更改。
OskarD90 '16

1
如果它在gitignore中,为什么会再次开始跟踪更改
Shapeshifter

解决了OP的问题,但并未真正回答问题。
特拉维斯·威尔逊

1

我会把它们放在你的 .gitignore文件中,然后根据需要手动复制它们。

因此,骨架文件名将在git中,忽略文件名将不在git中(但将在.gitignore中)。这样,当完成将它们从“模板”(也许比骨架更好的名称)复制到“实际”的手动步骤时,它们将立即被忽略。


1
没有办法先将它们添加到仓库中,然后再将它们添加到.gitignore?如果有解决方案可以包含文件,但是在提交或执行某些操作后不进行任何更改,那将是很好的。
gorelative 2012年

1
@mklauber我想无限期保留它们,直到我跑步为止git rm <file>。目的是IE:config.php文件。我想保留配置文件,但是我显然不想跟踪客户端之间的数据库凭据,因为它们是不同的。
gorelative 2012年

1
是的,我的rails database.yml文件有问题。我们保留一个骨架,然后复制并更改它。
Michael Durrant 2012年

如果我创建了这些“骨骼”配置文件,您是否会将它们添加到初始提交中。然后修改.gitignore以忽略该文件?实际上是将文件保留在存储库中但还是作为框架?
gorelative 2012年

10
您有两个选择:通过添加文件git add file1,然后编辑.gitignore文件。提交的文件将保留在其中,并且不会更新。或者:您可以先添加文件.gitignore,然后再添加git add --force file1文件以强制使用。可以在必须覆盖文件的情况下使用第二个选项
klaustopher 2012年

1

给出的答案只是部分解决了问题,但引入了更多问题。

我需要保留“ Web.Local.config”文件。对我有用的唯一解决方案是:

1.从项目中排除文件

2.创建文件的单独副本为Web.LocalTemplate.config

现在,Git跟踪了“ Web.LocalTemplate.config”,所有开发人员都可以将其用作起点。但是,“ Web.Local.config”(不是项目的一部分)将被自动忽略。


如何git update-index --skip-worktree FILENAME仅部分解决您的问题,甚至增加更多问题?它可以完全解决您要尝试执行的操作。你试过了吗?
阿米尔·阿斯拉夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.