我在Windows上使用git 1.8.3时遇到了一个奇怪的错误。使用git subtree
,我在两个项目之间共享一个文件并将其推送到另一个存储库。
所以,在repo1中我做到了这一点:
# push script
git subtree split --prefix=shared-dir --rejoin --branch split
git push shared-repo split:master
git branch -D split
在两个repos中,shared-repo
指的是包含共享代码的遥控器。共享代码将驻留在具有相同名称的目录中。
在repo2中我这样做了:
# pull script
git fetch shared-repo
git subtree merge --prefix=shared-dir shared-repo/master
我期望它做的是获取共享文件并将其放在目录./shared-dir/
下的repo2中。发生的事情是文件放在存储库的根目录中!
将文件移动到正确的文件夹,提交和执行与repo1的推送脚本类似的操作会导致推送中的拒绝,因为它表示推送不是快进的。再次运行pull脚本表示一切都是最新的。
我被踩了,在互联网上搜索并没有透露其他人有类似的问题。怎么了,我该怎么办?
更新:在Ubuntu 12.04上使用git 1.7.9.5也是如此,两周前从git存储库获取了git-subtree
脚本。我也改变命令说--prefix=./shared-dir/
无济于事。
有趣的是,git subtree
创建了shared-dir
目录,但是将共享文件放在根目录中而不是放在该目录中。
答案 0 :(得分:2)
我在gith repo上遇到了类似的问题,我从Github撤出:git subtree pull
删除了回购的内容。添加前缀git subtree add --prefix
不起作用,因为前缀已经添加。
对我有用的唯一解决方案是删除目录,然后再次添加前缀。例如:
rm -rf JSQMessagesViewController
# now commit all, then add
git subtree add --prefix JSQMessagesViewController https://github.com/jessesquires/JSQMessagesViewController master --squash
# Now the pull will work!
git subtree pull --prefix JSQMessagesViewController https://github.com/jessesquires/JSQMessagesViewController master --squash
当然,欢迎更好的解决方案。
答案 1 :(得分:1)
问题是第一次将共享目录添加到存储库时应该使用:
git subtree add --prefix=... .../...