409

我团队中的每个开发人员都有自己的本地配置。该配置信息存储在一个名为的文件中,该文件devtargets.rb用于我们的 rake 构建任务。不过,我不希望开发人员破坏彼此的 devtargets 文件。

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

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

那可能吗?这肯定是一个不错的功能...

4

5 回答 5

511

当然,我不时使用

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

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

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

相关文件

--[no-]assume-unchanged
指定此标志时,不更新为路径记录的对象名称。相反,此选项设置/取消设置路径的“假定不变”位。当“假设不变”位打开时,用户承诺不更改文件并允许 Git 假设工作树文件与索引中记录的内容匹配。如果要更改工作树文件,则需要取消设置以告知 Git。lstat(2)当在系统调用非常慢的文件系统(例如 cifs)上处理大型项目时,这有时会很有帮助。

如果 Git 需要修改索引中的这个文件,例如在提交合并时,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并且您可以在那时进行正常的存储和合并等。

于 2010-07-23T16:20:02.527 回答
113

这样做的首选方法是使用git update-index --skip-worktree <file>,如本答案中所述:

assume-unchanged专为检查一组文件是否已被修改的情况而设计;当您设置该位时,git(当然)假定与索引的该部分对应的文件在工作副本中没有被修改。所以它避免了混乱的统计调用。每当索引中的文件条目发生更改时(因此,当文件在上游更改时),该位都会丢失。

skip-worktree不仅如此:即使 git 知道文件已被修改(或需要通过 reset --hard 等进行修改),它也会假装它没有被修改,而是使用索引中的版本。这一直持续到索引被丢弃。

要撤消此操作,请使用git update-index --no-skip-worktree <file>

从 git 版本 2.25.1 开始,这也不再是推荐的方式,引用:

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

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

于 2017-04-21T06:48:52.150 回答
48

常见的做法似乎是创建一个devtargets.default.rb并提交它,然后指示每个用户将该文件复制到devtargets.rb(位于 .gitignore 列表中)。例如,CakePHP 对它的数据库配置文件做同样的事情,它自然会随着机器的变化而变化。

于 2010-07-23T15:24:35.943 回答
2

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

  • 前往Local Changes( Cmd + 9)
  • 选择要忽略的文件
  • F6把它们移到另一个Change Set
于 2015-10-29T10:38:04.390 回答
2

使用 Git 无法忽略对跟踪文件的更改。Git FAQ 解释了这一点:

Git 没有提供这样做的方法。原因是如果 Git 需要覆盖这个文件,例如在结帐期间,它不知道对文件的更改是否宝贵并且应该保留,或者它们是否无关紧要并且可以安全地销毁。因此,它必须采取安全路线并始终保护它们。

尝试使用 git update-index 的某些功能是很诱人的,即假设未更改和跳过工作树位,但是这些不能正常工作,因此不应该以这种方式使用。

如果您的目标是使用配置文件,那么最好的做法是添加示例或模板文件,然后让用户将其复制到位或让脚本创建适当的文件。然后,您应该忽略实际配置文件的位置,只签入示例或模板。

于 2021-06-09T22:30:20.843 回答