GIT默认情况下忽略对提交文件的本地更改

时间:2018-12-07 10:09:20

标签: git gitignore git-commit

我有一个提交的文件“ build.properties”,该文件必须位于我们的项目存储库中,因为它包含重要的构建信息。

有时候,某些开发人员执行一些本地测试,更改此文件的内容,然后他们错误地提交更改(通过简单地暂存他们所做的所有更改,包括build.properties)。 / p>

现在,我想以某种方式忽略对该文件所做的所有本地更改,以免这种情况会继续破坏构建,例如,当开发人员将运行* git add **或 git commit -a ,该文件将不会包含在暂存文件中。

我已经进行了一些研究,但是直到现在,考虑到该操作需要远程应用,例如,我可以使用 .git / info / exclude 文件夹,但是每次新开发人员克隆存储库时,他都必须再次设置 .git / info / exclude ,我想避免这种情况。

此外,.gitignore仅适用于未跟踪的文件,如果我将跟踪文件添加到.gitignore,则将不会被忽略。我发现有人建议将.gitignore与git rm --cached结合使用,然后重新添加文件,但是一旦将文件重新添加到树中,就一直跟踪更改,还从官方GIT文档中读取信息, .gitignore看起来不适合我的需求。

有什么解决方案吗?谢谢!

更新

我是SVN的忠实拥护者,对GIT的了解更多,对SubVersion的了解也更多。

所以我想,我的问题的答案是GIT并没有提供实现这种目标的任何方法...

同意这不是最好的做法,并且还有其他方法可以实现我所要求的内容,而无需使用著名的源代码控制工具GIT对其进行管理,但是我的意图仍然很普遍,我们可以在其中解决许多不同的背景。

我的意思是GIT提供了解决大多数标准实践和原则的方法,例如,我无法更改原则的远程历史记录,但是GIT给了我实现这一目标的力量,所以我想知道为什么也不提供解决我问题的简便方法。

2 个答案:

答案 0 :(得分:1)

我了解您的尝试及其背后的原因是有根据的。但事实是,它与Git的分布式和并行性质相矛盾。 Git被设计为:

  

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

如果Git正在处理您的文件,则认为该文件可能已更改并且需要跟踪(否则,请打扰版本控制系统)。正如您所指出的,可以在本地执行此操作,因为这是一个单独的决定,告诉Git您不想在自己的计算机上提交对该文件的更改。尝试在全球范围内进行操作基本上就像是尝试将Git用作简单的文件存储系统。

因此,请记住,Git并非旨在满足您的要求,您可能需要考虑以下几种选择:

  1. 您团队中的所有开发人员都必须在本地告诉Git他们不想提交对该文件的修改:这是一种解决方法。这样做的代价是每次克隆存储库时都必须这样做。如果选择此选项,则可能要考虑使用git update-index --skip-worktree <file>(您可以阅读有关为什么使用而不是其他选项here的更多信息);
  2. 检出Git扩展名,并确定其中之一是否满足您的需求:我从未使用过它,但我知道Git LFS支持文件锁定。它不是为您要执行的操作而构建的,但它可能是一个选择;
  3. 更改您的问题解决方法:如果您使用的是Git,并且需要它不能容纳,则可以与Git对抗或按原样使用它,然后找到其他方法做你想做的。毕竟,Git对于跟踪事物非常有用,您将来还可能希望更改并提交文件。如何考虑从开发属性文件(可以根据每个开发人员的需要而变化)中分离“默认”属性文件(在存储库中提交的一个)的方法?我对您的开发环境不熟悉,但是我相信您可以找到一种方法,如果未指定其他文件,则使用默认文件;如果指定了其他文件,则使用特定文件。

答案 1 :(得分:0)

更好的方法是针对不同的环境使用多个build.properties

示例:buildDev.properties用于开发环境,类似地buildTest.propertiesbuildProd.properties用于测试产品环境。

注意:git rm --cached用于在您推送文件以删除不该拥有的文件并且现在还希望取消跟踪该文件时使用。在这种情况下,您可以在.gitignore中添加文件名,然后使用git rm --cached从暂存区中删除它,然后提交。现在,此提交将删除可以推送到主服务器的文件,而无需在本地删除文件