【问题标题】:Problems with merging after a git update-index --assume-unchangedgit update-index --assume-unchanged 后合并的问题
【发布时间】:2017-01-11 11:41:53
【问题描述】:
我的同事问我是否可以在提交文件后导入文件,例如 pom.xml 文件,通常用于 maven 项目。
我发现 git update-index --assume-unchanged 在这种情况下很有用。但是当我尝试从另一个分支合并时,git 仍在跟踪被忽略的文件并发生冲突。
我该怎么做才能避免这种情况?我应该在所有分支中使用这个命令(git update-index assume-unchanged)吗?
【问题讨论】:
标签:
java
git
maven
version-control
ignore
【解决方案1】:
命令git update-index --assume-unchanged filename不能在两个分支中使用,这是一种暂时忽略文件的方法。当您修改文件,然后想要切换或合并到其他分支时,git会显示错误消息,因为您有未提交的更改,这意味着您应该在切换或合并分支之前使用git update-index --no-assume-unchanged filename。
针对您的情况,您可以参考以下两种方式:
-
文件不再需要做版本控制。所以你可以将文件添加到
.gitignore,并使用git rm --cached filename取消跟踪。
-
需要对文件进行版本控制。合并分支时,可以使用
git merge branchname -X ours/theirs使文件无效。
【解决方案2】:
正如我评论的那样 - --assume-unchanged isn't the right tool for this job
According to the Git documentation 最好的方法是使用git rm --cached <file>;
您可能想做的另一件有用的事情是将文件保留在工作树中,但将其从暂存区域中删除。换句话说,您可能希望将文件保留在硬盘上,但不再让 Git 跟踪它。如果您忘记在 .gitignore 文件中添加某些内容并且不小心将其暂存,例如大型日志文件或一堆 .a 编译文件,这将特别有用。为此,请使用--cached 选项
然后,您需要将现在未跟踪的文件添加到您的 .gitignore 文件中。
对于分支 - 您必须管理跟踪此文件的分支的合并,以确保它不会再次进入存储库。最简单的方法是在合并之前在每个分支中进行此更改。
【解决方案3】:
我发现了 git update-index --assume-unchanged
这告诉 git 不要将工作目录中的文件与当前存储库状态进行比较。
另一方面,合并发生在存储库中的提交之间。因此,如果您与其他人的合并在同一文件上发生更改,您仍然会发生冲突。
您需要该功能的示例是 mavens 项目配置文件。
在我看来,尤其是这个文件不应该被忽略或以其他方式从 scm 中排除。那你为什么需要它呢?
我的猜测是您在 pom 中定义了指向本地资源的属性。如果是这样:将settings.xml 中的属性移到"user.home"/.m2 中。这是他们所属的地方。