我有一个提交的文件"build.properties",该文件必须在我们的项目存储库中,因为它包含重要的构建信息。
有时,一些开发人员会执行一些本地测试,更改此文件的内容,然后他们会错误地提交更改(通过简单地转移他们所做的所有更改,包括build.properties)。
现在,我想以某种方式忽略对该文件所做的所有本地更改,以避免这种不断阻碍构建的情况,例如,当开发人员运行*git-add**或git-commit-a时,该文件将不会包含在暂存文件中。
我已经做了一些研究,但到目前为止,考虑到操作需要远程应用,我找不到任何与我想要的兼容的解决方案,例如,我可以使用.git/info/exclude文件夹,但每次新的开发人员克隆存储库时,他都必须再次设置.git/info/exclude,我希望避免这种情况。
此外,.gitignore只适用于未跟踪的文件,如果我将跟踪的文件添加到.gitigner中,它将不会被忽略。我发现有人建议将.gitignore与git-rm结合使用--缓存,然后重新添加文件,但一旦将文件重新添加到树中,就会不断跟踪更改,还可以从官方git文档中读取,.gitigner看起来不适合我的需求。
有什么解决方案吗?谢谢
更新
我是SVN的忠实粉丝,我对GIT了解得越多,我就越欣赏SubVersion。
所以我想,我的问题的答案是,GIT没有提供任何方式来实现这样的目标。。。
同意这不是最好的做法,也同意在不使用著名的源代码管理工具GIT进行管理的情况下,还有其他方法可以实现我的要求,但我的意图仍然是我们在许多不同情况下可能面临的常见问题。
我的意思是,GIT提供了绕过大多数标准实践和原则的方法,例如,我不能为原则更改远程历史,但GIT给了我实现这一点的力量,所以我想知道为什么它不能提供一种简单的方法来绕过我的问题。
我理解你试图做什么以及背后的原因是有效的。但问题是,它与Git的分布式和并行性质相矛盾。Git被设计成一个:
版本控制系统,用于跟踪计算机文件的更改,并在多人之间协调这些文件的工作
如果你的文件由Git处理,它会认为文件可能会被更改,需要跟踪(否则为什么要麻烦版本控制系统)。正如你所指出的,可以在本地进行,因为在你自己的机器上告诉Git你不想提交对该文件的更改是一个孤立的决定。尝试在全球范围内做到这一点基本上就像尝试将Git用作一个简单的文件存储系统。
因此,请记住,Git并不是为做你想做的事情而设计的,你可能需要考虑几个选项:
-
团队中的所有开发人员都必须在本地告诉Git,他们不想提交对该文件的修改:这是一种变通方法。这样做的代价是每次克隆回购时都必须这样做。如果您选择此选项,您可能需要考虑使用
git update-index --skip-worktree <file>
(您可以在此处阅读更多关于为什么使用而不是其他选项的信息) - 查看Git扩展,看看其中一个是否能满足您的需求:我从未使用过它,但我知道Git LFS支持文件锁定。它不是为你想要做的事情而构建的,但它可能是一种选择
- 改变你的问题解决方法:如果你正在使用Git,而你有一种需求,它无法满足你的需求,你可以对抗Git,也可以按原样使用它,然后找到其他方法来做你想做的事。毕竟,Git对于跟踪事情非常有用,你可能还想在未来更改并提交你的文件。想一种方法将您的"默认"属性文件(在回购中提交的文件)与您的开发属性文件(可以根据每个开发人员的需求进行更改)分离如何?我不熟悉您的开发环境,但我相信,如果没有指定其他文件,您可以找到使用默认文件的方法,如果指定了特定文件,则可以使用特定文件
更好的方法是为不同的环境提供多个build.properties
。
示例:适用于开发环境的buildDev.properties
,类似于适用于测试和生产的buildTest.properties
和buildProd.properties
。
注意:git rm --cached
是在您推送了一个不应该删除的文件,现在还想取消跟踪时使用的。在这种情况下,您可以在.gitignore
中添加文件名,然后使用git rm --cached
将其从暂存区删除,然后提交。现在,这个提交删除了可以推送到master的文件,而无需在本地删除该文件。