在一个git rebase
或git merge
,符号链接似乎被转换为纯文本文件。
树枝上运行git rebase master
当我跑与符号链接下面的问题。
首先,一些背景:
在底垫中,我得到了每个符号链接的“CONFLICT (add/add): Merge conflict in ...
”。当我做每个假设符号链接上的git ls-files --stage
,它显示模式100644(即,纯文本文件,而不是一个符号链接)。我写了一个简单的shell脚本与所需的符号链接来替换这些文本文件,将它们添加到索引,并与重订继续。
前阵子我注意到一组我在以前的以前的分支添加符号链接,已经演变成上主的纯文本文件,每个都包含了什么以前一直是链接的目标只是路径;我怀疑在从分支到主合并过程中发生变化的时候,现在我更加肯定。
所以我的问题是:
git rebase
或git merge
抛出了冲突和变化的符号链接到纯文本文件,有没有更好的办法来解决不是删除每个文件并重新创建符号链接的问题?有没有办法让GIT中更好地处理在合并过程中的符号链接?
不是真的,没有。如果两个添加的文件具有相同的内容,Git不会调用,在所有冲突(我只是测试这一点),并合并成功。
归根结底,问题是,一个符号链接是一个数据文件,用数据作为链接,这一切只是一条线的目标(没有终止换行符!)。充分链接-Y的操作系统,但是,存储该数据特别,只能专门访问它。 (视窗一般不配备充分链接-Y并将其保存为纯文本文件来代替。)所以,两个假定有两个符号连接待合并是在两次提交无论从原来的符号链接在原来的不同提交文件:
merge base: file foo should be a symlink to bar/baz
--ours: file foo should be a symlink to our/name
--theirs: file foo should be a symlink to different/path
因为它是所有一行,GIT中不能合并这两个变化,这既改变源线,1号线是唯一的合并基础文件行的。您必须手动将它们合并。
(在你的情况,也没有第1阶段进入所有,只是阶段2和3,因此“添加/加冲突”,这就是我所谓的高层次冲突,从来没有进入低级别的文件合并代码。下面的说明是低层次的冲突的情况下,也可以出现预期多,并且是-X ours
或-X theirs
可以工作。对于高层次的冲突,Git会永远不会进入-X
处理代码。)
当我做每个假设符号链接上的
git ls-files --stage
,它显示模式100644(即,纯文本文件,而不是一个符号链接)。
这可以说是一个错误。我会注意到,当我尝试这样做实验,那不是我的了:
$ git ls-files --stage
100644 79f977c119cd6951428b04565177cb4e53dd4bc3 0 README
100644 fa49b077972391ad58037050f2a75f74e3671e92 0 newfile
120000 1b407f24bddc88f87d93302f462251bf881acbc9 2 newlink
120000 1de565933b05f74c75ff9a6520af5f9f8a5a2f1d 3 newlink
注意mode 120000
线在这里。符号链接仍然是我的工作,树一个符号链接,太:
$ ls -l newlink
lrwxr-xr-x 1 torek torek 9 Feb 5 00:55 newlink -> newtarget
在合并的基础已经存在第三(不同)符号链接,我不知道混帐会继续我的工作树文件作为符号链接。
(我希望git mergetool
卷起提取这两个为纯文本文件:
$ git checkout-index --temp --stage 2 newlink
.merge_link_OzyiFR newlink
所以,如果你使用git mergetool
,它在这里git mergetool
的错,真的。但是,这不应该是能够设置索引条目模式100644
。)
如果
git rebase
或git merge
抛出了冲突和变化的符号链接到纯文本文件,有没有更好的办法来解决不是删除每个文件并重新创建符号链接的问题?
不是真的,没有。你必须选择(的我们VS他们的),它链接到喜欢,如果任一个,甚至第三值(或许可以追溯到合并基础版本,或到另一条路径)。
请注意,如果只有一个“边”(我们或他们),你不会得到一个合并冲突改变了链接的目标。在这种情况下,无论是合并基础VS我们是一样的,所以Git的需要他们的变化,或合并基础VS他们是一样的,所以Git的需要我们的变化,正是因为它为任何常规文件。 (见the three-way merge section of the git read-tree
documentation。)
从逻辑上讲,-X ours
或-X theirs
应该会自动解决冲突,但只有在一个真正的三方合并的情况。当有一个附加/添加冲突(因为这两个符号链接的目标,在这两个尖端承诺,差异,且基本没有符号链接的话),我们从来没有得到这一点和-X
不能帮助。