4

私の別のプロジェクト (B) と一定量のコードを共有する、より大きな git リポジトリ (A) があります。メンテナンスを容易にするために、共通コード (C) を含む 3 番目のリポジトリを用意することにしましたgit subtree

Aにすべてを準備し(共通コードをフォルダー「sub」に入れます)、サブディレクトリを別のGitリポジトリに切り離す(移動する)で説明されている手順を使用してCを作成しました

いくつかのコミットで C ができたので、それを A のフォルダー サブに戻したいと思いました。サブフォルダーのすべてのコミットが複製される限り、 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 I usedで説明されているように

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.
4

3 に答える 3

1

git push -fうまくいったと思われるものを試しました。正確に何が起こったのか、そしてその理由を知りたいと思っています。

于 2012-09-29T13:34:33.553 に答える
0

のデフォルトの動作は、git pushローカルとリモートで同じ名前のブランチがある場合、すべてのブランチを現在のブランチリモートにプッシュしようとすることです。git pushマニュアルから:

特別なrefspec:(または+:非早送り更新を許可する)は、gitに「一致する」ブランチをプッシュするように指示します:ローカル側に存在するすべてのブランチについて、同じ名前のブランチがすでに存在する場合、リモート側が更新されますリモート側で。これは、明示的なrefspecが見つからず(コマンドラインにも、対応するリモートファイルのプッシュラインにもありません---以下を参照)、push.default構成変数が設定されていない場合のデフォルトの操作モードです。

この場合、現在のリモートはローカルとリモートCの両方にあるため、プッシュされます。ツリーがまったく一致しないため、プッシュはメッセージで失敗します。masterC/mastermaster -> master (non-fast-forward)

あなたgit pullがあなたのブランチに行くとき、それはup-to-dateあなたがあなたの現在のブランチを引っ張っているのでそれを言います、それは最新です。

この動作を変更するには、gitconfigで値git pushを設定する必要があります。http://www.kernel.org/pub/software/scm/git/docs/git-config.htmlpush.defaultで「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 に答える