3

我在 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

我期望它做的是获取共享文件并将其放在目录下的 repo2 中./shared-dir/。发生的事情是该文件被放在存储库的根目录中!

将文件移动到正确的文件夹,提交和执行类似于 repo1 的推送脚本的内容会导致推送被拒绝,因为它表示推送不是快进的。再次运行拉取脚本表明一切都是最新的。

我被踩到了,在互联网上搜索并没有发现其他人有类似的问题。出了什么问题,我该怎么办?


更新: Ubuntu 12.04 上的 git 1.7.9.5 也发生了同样的情况,两周前该git-subtree脚本取自 git 存储库。我也改变了命令说--prefix=./shared-dir/无济于事。

有趣git subtree的是,创建shared-dir目录,但将共享文件放在根目录而不是该目录中。

4

2 回答 2

2

我在从 Github 提取的 git repo 上遇到了类似的问题:git subtree pull正在删除 repo 的内容。添加前缀 withgit 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

当然,我们欢迎更好的解决方案。

于 2017-04-06T21:10:57.667 回答
1

问题是第一次将共享目录添加到存储库应该这样做:

git subtree add --prefix=... .../...
于 2013-08-01T15:18:33.253 回答