我们一直试图让git-subtree处理一个项目(使用git版本1.7.9.4)并且遇到了一些复杂问题.几个月前,其他人之前使用此命令添加了子树:
git subtree add --prefix=foo git@example.com:foo.git master
Run Code Online (Sandbox Code Playgroud)
现在已经有了实质性的变化foo,我们想要合并这些变化,最好将它们压缩.自导入文件以来,没有任何文件被修改过.
我已经尝试了三件事来尝试合并更改.
第一:
git subtree pull --squash -P foo git@example.com:foo.git master
Run Code Online (Sandbox Code Playgroud)
抛出异常: Can't squash-merge: 'foo' was never added.
第二:
git subtree pull -P foo git@example.com:foo.git master
Run Code Online (Sandbox Code Playgroud)
这有点工作(但有一些问题,但是存在拉入所有提交的问题,并且与已修改的文件有冲突.
最后,我尝试了这个:
git pull --squash -s subtree git@example.com:foo.git master
Run Code Online (Sandbox Code Playgroud)
这给了我想要的结果,输出Automatic merge went well; stopped before committing as requested和所有文件显示为已修改(具有正确的内容).
理想情况下,我想继续使用第一个git-subtree版本并获得接近上一版本的输出.如果我们必须始终使用最后一个版本,我们会,但我有点困惑为什么最后一个不产生合并冲突,而中间版本.
任何帮助表示赞赏.
我有几个依赖于同一个库的项目,为此我想维护一个单独的git存储库,以便在每个项目中使用git-subtree进行管理.例如,在每个项目中,我可以做到:
project1$ git subtree add --prefix=lib1 /path/to/lib1.git master
project2$ git subtree add --prefix=lib1 /path/to/lib1.git master
Run Code Online (Sandbox Code Playgroud)
现在在处理project1的过程中,我对lib1进行了一些更改,比如lib1/file1.c,并将其推回到中央仓库:
project1$ git add lib1/file1.c
project1$ git commit -m "updates to lib1"
project1$ git subtree push --prefix=lib1 /path/to/lib1.git master
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但现在我想更新project2的lib1副本.所以我尝试:
project2$ git subtree pull --prefix=lib1 /path/to/lib1.git master
Auto-merging lib1/file1.c
CONFLICT (content): Merge conflict in lib1/file1.c
Automatic merge failed; fix conflicts and then commit the result.
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?我确定没有对project2下的任何lib1文件进行任何更改,那么为什么会出现冲突呢?
冲突是半空的,就像这个问题中报道的那样.所有东西都在一个系统(OS X)中被拉/推,所以我知道那里的线路结尾没有问题.
当然这是git-subtree的常见用例,并且有一个我看不到的简单答案.请帮忙!
编辑:我发现了一个令人不满意的解决方法:在将更改推送到子树后,我需要重新运行子树拉:
project1$ git subtree push --prefix=lib1 /path/to/lib1.git master
project1$ git subtree pull --prefix=lib1 …Run Code Online (Sandbox Code Playgroud) 问题:即使我没有任何更改,每次尝试拉入我的子树时,我都会遇到合并冲突。
我在做什么:
在子树仓库中
# Make some changes
$ git commit -am 'Changes made'
$ git push origin master
Run Code Online (Sandbox Code Playgroud)
在主回购
$ git subtree add --prefix public/common {{subtree-repo}} master --squash
# Make some changes
$ git commit -am 'Changes made'
$ git subtree push --prefix public/common {{subtree-repo}} master
Run Code Online (Sandbox Code Playgroud)
在子树仓库中
$ git pull origin master
# Make some changes
$ git commit -am 'Changes made'
$ git push origin master
Run Code Online (Sandbox Code Playgroud)
在主回购
$ git subtree pull --prefix public/common …Run Code Online (Sandbox Code Playgroud) 我开始在git 1.8.2中学习子树合并.我创建了一个简单的示例来测试对迁移到主项目的第三方仓库的更改.
我正在关注6.7 Git工具 - 子树合并示例.
'sub'项目作为'main'项目的子目录包含在内.
在我对'sub'项目进行更改后,当我尝试将更改合并到'main'项目时,git会报告冲突.
测试摘要
合并失败并发生冲突.Merge对要保留的更改行的版本感到困惑.
<<<<<<< HEAD
main
=======
main upstream change
>>>>>>> sub_branch
main.git
sub
sub.git
tm
Run Code Online (Sandbox Code Playgroud)
完整的测试脚本
#!/bin/sh
# initialize empty repos
for i in main sub
do
rm -rf $i{,.git}
mkdir $i.git
cd $i.git;
git --bare init;
cd ..;
git clone $i.git
cd $i
echo $i > readme.md
git add readme.md
git commit -a -m "added readme.md"
git push origin master
cd ..
done …Run Code Online (Sandbox Code Playgroud)