我可以'提交'一个文件,并忽略其内容的变化?

我的团队中的每个开发人员都有自己的本地configuration。 该configuration信息存储在我们的rake构build任务中使用的名为devtargets.rb的文件中。 不过,我不希望开发人员破坏对方的devtargets文件。

我的第一个想法是将该文件放在.gitignore列表中,这样它就不会被提交给git。

然后我开始想知道:是否可以提交文件,但忽略对文件的更改? 所以,我会提交该文件的默认版本,然后当开发人员在本地机器上进行更改时,git会忽略这些更改,当您执行git status或git commit时,它不会显示在已更改文件的列表中。

那可能吗? 这当然是一个很好的function…

当然,我不时使用这个

 git update-index --assume-unchanged [<file> ...] 

要撤消并重新开始追踪(如果您忘记了未跟踪的文件, 请参阅此问题 ):

 git update-index --no-assume-unchanged [<file> ...] 

相关文件 :

– [无糖]假设-不变
当指定此标志时,为pathlogging的对象名称不会更新。 相反,此选项设置/取消path的“假定不变”位。 当“假设不变”位打开时,用户承诺不更改文件,并允许Git假定工作树文件与索引中logging的内容匹配。 如果你想改变工作树文件,你需要取消这个位来告诉Git。 当在一个非常慢的lstat(2)系统调用的文件系统(例如cifs)上处理一个大项目时,这有时是有用的。

如果需要在索引中修改这个文件,Git会失败(优雅地),例如,在提交时合并; 因此,如果假设未跟踪的文件在上游发生更改,则需要手动处理该情况。

在这种情况下,优雅地失败意味着,如果在进行拉动时,如果在该文件的上游有任何变化(合法变化等),则将会说:

 $ git pull … From https://github.com/x/y 72a914a..106a261 master -> origin/master Updating 72a914a..106a261 error: Your local changes to the following files would be overwritten by merge: filename.ext 

并会拒绝合并。

在这一点上,你可以通过恢复你的本地修改来克服这个问题,这里有一个方法:

  $ git checkout filename.ext 

然后再次拉动并重新修改你的本地文件,或者可以设置–no-assume-unchanged并且你可以正常存储和合并等等。

常见的做法似乎是创build一个devtargets.default.rb并提交它,然后指示每个用户将该文件复制到devtargets.rb (位于.gitignore列表中)。 例如,CakePHP为其数据库configuration文件做了相同的处理,这个文件在机器间自然变化。

这样做的首选方法是使用git update-index --skip-worktree <file> ,正如在这个答案中所解释的:

assume-unchanged是针对检查一组文件是否被修改是昂贵的情况而devise的; 当你设置这个位的时候,git(当然)会假定在这个工作拷贝中没有修改对应于那个索引部分的文件。 所以它避免了统计调用的混乱。 只要文件在索引中的条目发生更改(因此,文件在上游发生更改时),该位就会丢失。

skip-worktree是这样:甚至在git知道文件已被修改(或需要通过重设进行修改–hard等)的情况下,它会假装它没有被使用,而是使用来自索引的版本。 这一直持续到索引被丢弃。

要撤消这个,使用git update-index --no-skip-worktree <file>

对于IntelliJ IDEA用户:如果您想忽略文件(或文件)的更改,可以将其移至不同的Change Set

  • 转向Local ChangesCmd + 9
  • select您要忽略的文件
  • F6将它们移动到另一个Change Set