告诉Git永远不要更新一个文件。

7
我在git中有一些文件(即配置文件),我需要它们在git仓库中,但我不希望它们被更新(因为运行它们和make会更改配置文件)。所以,有没有办法告诉git忽略对文件的任何更改,但仍将原始文件保留在仓库中?目前我发现做到这样的唯一方法是将该文件添加到.gitignore文件中,然后使用-f直接将该文件添加到项目中。是否有更好的方法?
2个回答

9
您可以在文件上使用git update-index --assume-unchanged命令。

--assume-unchanged选项可用作粗略的文件级机制,以忽略已跟踪文件中未提交的更改(类似于.gitignore对未跟踪文件的处理方式)。您应该记住,显式的git add操作仍会导致该文件从工作树中刷新。如果需要修改此文件的索引,例如在合并提交时,Git将失败(优雅地);因此,如果上游更改了假定为未跟踪的文件,则需要手动处理该情况。


这对我似乎起作用了。尽管当我进行git push时,好像它不会被发送到更大的代码库中。这是正确的吗? - Leif Andersen
Leif Andersen: 你是正确的。 - Alan Haggai Alavi
这是危险的,因为在某些情况下,本地文件可能会被来自远程的数据覆盖/更新。请参见 https://dev59.com/nWYr5IYBdhLWcg3wfaSc 中的讨论。 - Arni J

5
我不会使用git来管理那些文件。我会将它们放在你的.gitignore中,以便git忽略它们,并将模板文件(例如foo.template用于名为foo的文件,或者可能是template/foo)存放到git中。然后,当你克隆仓库时,可以将它们复制出来并进行修改,而git不会对副本做任何操作,同时仍然管理模板。如果你有多个这样的文件,可以提供一个脚本或make规则之类的东西来从模板中填充所有配置文件,以便更容易地进行设置。
更好的设计是将项目配置与本地配置分开,或者在单独的本地文件中覆盖项目级默认值。项目级文件被提交,本地文件被忽略,并且两者都被使用。也许某些配置设置只对项目有意义,某些只对本地有意义,在这种情况下,你只需从相应的文件中提取适当的设置;或者你可以使用项目设置作为默认值,让本地配置覆盖默认值。这样,你就可以一次性更新项目设置(即共享的设置),而不干扰人们的本地设置。当然,这取决于是否控制了设置格式;如果你正在使用一个以特定格式接受其设置的第三方工具,并将所有内容混合在一个文件中,那么你可能必须使用模板方法。

提交 .sample 文件通常也是我们的做法;但要小心使用过时的副本。我们还通过将该文件提交到仓库,然后将其添加到.gitignore中来欺骗系统-尽管我只会在必要时这样做。 - Uriah Carpenter
@Uriah 是的,你确实需要小心过时的副本,但在任何系统中,你都需要小心,其中你有配置文件应该被本地修改,但足够复杂以需要版本控制的模板。我也会在我的答案中添加一个更好的设计注释,尽管这可能取决于他们是否控制配置文件格式。 - Brian Campbell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接