默认情况下,GIT会忽略已提交文件的本地更改。

3
我有一个名为“build.properties”的文件,这个文件必须在我们的项目仓库中,因为它包含重要的构建信息。有时候,一些开发人员会对此文件进行本地测试,并且通过错误操作(例如简单地将所有更改提交到暂存区,包括build.properties)提交更改。现在,我希望以某种方式忽略对该文件所做的所有本地更改,以避免这种情况破坏构建。例如,当开发人员运行* git add **或git commit -a时,该文件不会包含在暂存文件中。我已经进行了一些研究,但到目前为止,我还没有找到与我正在寻找的兼容的解决方案,考虑到该操作需要远程应用,例如我可以使用.git/info/exclude文件夹,但是每次新开发人员克隆存储库时,他都必须重新设置.git/info/exclude,我想避免这种情况。此外,.gitignore仅适用于未跟踪的文件,如果我将跟踪的文件添加到.gitignore中,则根本不会被忽略。我发现有些人建议使用.gitignore与git rm --cached相结合,然后重新添加文件,但是一旦将文件重新添加到树中,更改仍然会被跟踪。此外,从官方GIT文档中读取,.gitignore似乎不适合我的需求。有什么解决方案吗?谢谢!
2个回答

2
我了解你想做的事情,背后的原因是有道理的。但问题在于,这与 Git 的分布式和并行性质相矛盾。Git 被设计为:

用于跟踪计算机文件中的更改并协调多人对这些文件的工作的版本控制系统

如果你的文件由 Git 管理,它会假定该文件可能会被更改并需要被跟踪(否则为什么要使用版本控制系统)。正如你所指出的,在本地进行此操作是可能的,因为这是一个孤立的决定,告诉 Git 在你自己的机器上不想提交对该文件的更改。试图在全局范围内这样做基本上就像试图将 Git 用作简单的文件存储系统。

因此,记住 Git 不是为了做你想要的事情而设计的,你可能需要考虑一些选项:

您团队中的所有开发人员都必须在本地告诉Git他们不想提交对该文件的修改:这是一个解决方法。这样做的代价是每次克隆仓库时都需要这样做。如果您选择这种方法,您可能想考虑使用git update-index --skip-worktree <file>(您可以在这里阅读更多关于为什么使用它而不是其他选项);
检查Git扩展并找出其中是否有一个适合您的需求:我从未使用过,但我知道Git LFS支持文件锁定。它并不是为你正在尝试做的事情而构建的,但它可能是一个选择;
改变你的问题解决方法:如果你正在使用Git,并且你有一个它无法满足的需求,你可以要么与Git斗争,要么按照现有的方式使用它,并找到其他方法来实现你想要的功能。毕竟,Git非常有用,可以跟踪事物,你也许也想在将来更改和提交你的文件。你可以考虑一下如何分离你的“默认”属性文件(提交到仓库的那个)和你的开发属性文件(根据每个开发者的需要而变化的那个)。我不熟悉您的开发环境,但我相信您可以找到一种方法,如果没有指定其他文件,则使用默认文件,并在指定了其他文件时使用特定文件。

1
嗨,Aurora,我喜欢你的回答,也预料到了它,是的,我想做的可能与GIT的本质和一般的SCM的本质相矛盾,我完全同意,我们确实有其他解决方案,例如从build.prop中指向一个环境变量而不是硬编码值,绝对是一个更清洁的解决方案,但我们想检查一下GIT是否支持这样的东西,感谢你的建议,我会去看看的。 - ivoruJavaBoy

0
更好的方式是为不同的环境准备多个build.properties
例如:buildDev.properties用于开发环境,类似地,buildTest.propertiesbuildProd.properties用于测试生产环境。 注意:当您已经推送了一个文件并想要取消跟踪它时,可以使用git rm --cached。在这种情况下,您可以将文件名添加到.gitignore中,然后使用git rm --cached从暂存区中删除它,然后进行提交。现在,此提交将删除该文件,而不会在本地删除该文件,可以将其推送到主分支。

1
不,这是不正确的。.gitignore 对于已经被 Git 跟踪的文件无效。 - Lasse V. Karlsen
感谢您的回答Rishabh,不幸的是,正如问题中所说,.gitIgnore对已经被GIT跟踪的文件没有帮助。如果我将文件添加到.gitignore中,然后运行git status或git add *,该文件会显示并被暂存,您确定您所说的吗?也许我错过了中间的步骤,您是否测试过这个解决方案? - ivoruJavaBoy
git rm --cached 会在本地保留文件,但是在任何拉取更改的远程存储库中,该文件将被删除。哎呀! :-( - phd
@LasseVågsætherKarlsen,谢谢你的信息。它不起作用。正在编辑答案。 - Rishabh Agarwal

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