我有一个更大的git存储库(A),它与我的另一个项目(B)共享一定数量的代码。为了便于维护,我决定建立一个带有公共代码(C)的第三个存储库,然后通过git subtree
使用它。
我在A中准备了所有内容(将公共代码放在文件夹“sub”中)并使用Detach (move) subdirectory into separate Git repository中描述的过程创建C
现在我只有几个提交C,我想把它放回A,文件夹子。我使用了http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html中描述的方法,因为子文件夹的所有提交现在都是重复的。我并不介意这一点,但是现在我不知道如何继续使用这个子目录。
我在A / sub中进行了其他更改,我想将其推送到C.如git subtree push changes back to subtree project中所述,我使用了
git subtree split --prefix sub -b split-branch
仅使用子树创建分支。这需要一些时间,但成功完成。做
git checkout split-branch
git push remote-c master
给了我
failed to push some refs to "remote-c"
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and merge the remote changes
hint: (e.g. 'git pull') before pushing again.
但是git pull remote-c master
说我已经是最新的了。
如何解决这种情况?
EDIT1 :我试图用一个小的测试脚本重现问题。执行此脚本:
( cd testC; git init --bare )
( cd testA; git init )
cd testA
git remote add C ../testC
mkdir sub
echo subFile1 > sub/subFile1
echo subFile2 > sub/subFile2
git add sub
git commit -m "adding files"
echo FileA > fileA
echo FileB > fileB
git add fileA fileB
git commit -m "add root level files"
# extract subtree and push to C
git subtree split -P sub -b split-branch
git push C split-branch:master
# try to make an update in C
git checkout -b cmaster C/master
echo subFile2new > subFile2
git commit subFile2 -m "updated #2 in C"
git push
这导致
To ../testC
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to '../testC'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.
答案 0 :(得分:1)
我尝试了git push -f
这似乎有效。仍然想知道究竟发生了什么以及为什么。
答案 1 :(得分:0)
git push
的默认行为是尝试将所有分支推送到当前分支远程,如果您在本地和远程具有相同的命名分支。来自git push
手册:
特殊refspec :(或+:允许非快进更新) 指示git推送“匹配”分支:对于每个分支 存在于本地端,远程端如果是分支则更新 远程端已经存在相同的名称。这是 如果没有找到明确的refspec,则为默认操作模式(即 既不在命令行也不在任何Push线上 相应的遥控器文件---见下文)并没有push.default 配置变量已设置。
在这种情况下,由于您当前的遥控器为C
并且您同时拥有本地master
和远程C/master
,因此它将被推送,并且因为树根本不匹配将失败并显示master -> master (non-fast-forward)
消息。
当你git pull
到你的分支时它会显示up-to-date
,因为你正在拉你当前的分支,这是最新的。
要修改git push
的此行为,您需要在git config中设置push.default
值。在http://www.kernel.org/pub/software/scm/git/docs/git-config.html
答案 2 :(得分:0)
我的解决方案:升级git。 : - )
假设testA
和testC
目录已存在,您的测试脚本将成功。我正在使用最新版本的git(v1.8.2.1),所以也许他们修了一些东西,因为你发布了这个。
$ mkdir testA testC
$ ./test.sh
Initialized empty Git repository in /tmp/git/testC/
Initialized empty Git repository in /tmp/git/testA/.git/
[master (root-commit) 3d5644d] adding files
2 files changed, 2 insertions(+)
create mode 100644 sub/subFile1
create mode 100644 sub/subFile2
[master 398c203] add root level files
2 files changed, 2 insertions(+)
create mode 100644 fileA
create mode 100644 fileB
Created branch 'split-branch'
57fe3e8fc226d854b623f11444d82dc77fd45682
Counting objects: 4, done.
Delta compression using up to 16 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 269 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
To ../testC
* [new branch] split-branch -> master
Branch cmaster set up to track remote branch master from C.
Switched to a new branch 'cmaster'
[cmaster 07c7c89] updated #2 in C
1 file changed, 1 insertion(+), 1 deletion(-)
Counting objects: 5, done.
Delta compression using up to 16 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 285 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../testC
57fe3e8..07c7c89 cmaster -> master