4

我有一个更大的 git 存储库 (A),它与我的另一个项目 (B) 共享一定数量的代码。为了使维护更容易,我决定使用公共代码 (C) 创建第三个存储库,然后通过git subtree.

我准备好 A 中的所有内容(将公共代码放在文件夹“sub”中)并使用Detach (move) subdirectory 中描述的过程到单独的 Git 存储库中创建 C

现在我只有几个提交的 C,我想把它放回 A,文件夹 sub。我使用了http://www.kernel.org/pub/software/scm/git/docs/howto/using-merge-subtree.html中描述的方法,因为子文件夹的所有提交现在都被复制了。我不太介意这一点,但是现在我不知道如何继续使用这个子目录。

我在要推送到 C 的 A/sub 中进行了其他更改。如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.

但是 agit 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.
4

3 回答 3

1

我尝试了一个git push -f似乎有效的方法。仍然想知道到底发生了什么以及为什么。

于 2012-09-29T13:34:33.553 回答
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您需要push.default在 git 配置中设置该值。在http://www.kernel.org/pub/software/scm/git/docs/git-config.html中查找“push.default”

于 2013-01-22T08:17:57.297 回答
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
于 2013-04-17T19:58:11.313 回答