19

マージ先のサブディレクトリがかなり深くネストされている git のサブツリー マージ ステートジーを使用しようとしています - 現在は 4 レベルの深さです。

ここの指示に従って、モジュール リポジトリをリモートとして追加し、git read-tree を実行してリモート コードをローカル リポジトリのサブディレクトリに取得し、それらの変更をコミットしました。

私の問題は、リモートからメイン プロジェクトのマスター ブランチに変更をプルしてマージしようとしたときに発生します。上記のページのステップ 5 は、-s サブツリー スイッチを使用した git pull を提案しています。これは、サブディレクトリの深さが 1、2、または 3 レベルで、4 レベルでない場合に正しく機能します。

これは、2 レベルの深さのサブディレクトリにマージした結果です。sites/all/ の README ファイルが正しく更新されていることがわかります。私のリモート リポジトリでは、README はルートにあります。

$ git pull -s subtree REMOTE_REPO master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /path/to/my/REMOTE_REPO
 * branch            master     -> FETCH_HEAD
Merge made by subtree.
 sites/all/README |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

ここで、サブディレクトリは 3 レベルの深さです: sites/all/modules/. これも問題なく機能し、変更をプルしてファイルを更新します。

$ git pull -s subtree REMOTE_REPO master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /path/to/my/REMOTE_REPO
 * branch            master     -> FETCH_HEAD
Merge made by subtree.
 sites/all/modules/README |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

しかし今、私のコードは 4 レベルの深さのサブディレクトリにあります: sites/all/modules/my_module/. Git は REMOTE_REPO から変更を取得しているように見えますが、ファイルは更新されず、代わりに既に最新であると通知されます。

$ git pull -s subtree REMOTE_REPO master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /path/to/my/REMOTE_REPO
 * branch            master     -> FETCH_HEAD
Already up-to-date!
Merge made by subtree.

すぐにもう一度実行すると、変更が取り込まれたり、ファイルが更新されたりしません。

$ git pull -s subtree REMOTE_REPO master
From /path/to/my/REMOTE_REPO
 * branch            master     -> FETCH_HEAD
Already up-to-date.

この時点で git ログを表示すると、リモート リポジトリとマージからの変更が表示されますが、チェックアウト内のファイルは更新されていません。

これはバグですか、それとも何か間違っていますか?

更新: Chris Johnsen は、エラーをスローする次のオプションを提供しました。

$ git pull -X subtree=sites/all/modules/my_module/ REMOTE_REPO master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /Users/jeff/work/checkouts/compass_suite
 * branch            master     -> FETCH_HEAD
fatal: entry  not found in tree 173d4f16af4d2d61ae5c4b3446c392e8b49cc57d
4

2 に答える 2

54

将来の読者のために明確にするために、解決策は Chris Johnsen の応答のコメントにあります。「fatal: entry not found in tree」というエラーが表示される場合は、サブツリー プレフィックスの末尾にあるスラッシュを削除してください。

たとえば、次のようなコマンドで GitHub Pages サブツリーをプルしようとしている場合

git subtree --prefix gh-pages/ pull origin gh-pages

競合があり、次のようなエラーが発生します

 * branch            gh-pages   -> FETCH_HEAD
fatal: entry  not found in tree 6e69aa201cad3e5888f1d12af0d910f8a10a8ec3

gh-pagesディレクトリから末尾のスラッシュを削除するだけです

git subtree --prefix gh-pages pull origin gh-pages

これは機能し、マージを試みます。あなたが得ることができる最悪のシナリオは、自動マージが失敗し、次のようなエラーが発生する場合です

Automatic merge failed; fix conflicts and then commit the result.

ただし、競合を手動で解決するだけで完了です。

于 2012-11-07T01:01:45.140 に答える
10
于 2011-05-06T06:44:56.470 に答える