75

Git 1.7.11 で追加された新しいgit-subtreeコマンドを学習しようとしています。サブツリーを追加した後、リベースできなくなったようです。README ファイルを含むプライマリ リポジトリと、README ファイルも含むライブラリ リポジトリがあります。私はそれをlibディレクトリに追加しsubtree addます:

$ git subtree add -P lib/mylib myliborigin master

これは問題なく動作しますが、履歴は次のようになります。

*   22c1fe6 (HEAD, master) Merge commit 'b6e698d9f4985825efa06dfdd7bba8d2930cd40e' as 'lib/mylib' - 
|\                                                                                                                
| * b6e698d Squashed 'lib/mylib/' content from commit d7dbd3d
* b99d55b Add readme
* 020e372 Initial

今、レポをリベースしたいのですorigin/masterが、スカッシュコミットが適用されない親コミットに対して直接適用されるため失敗します。サブツリー。

この理由は、squash コミットを見れば明らかです。プレフィックスに関する情報はありません。これは、元の mylib コミットがまとめられたものです。次のマージコミットのみがそれについて何かを知っていますが、リベースはここでは考慮しません。

回避策はありますか (サブツリー コミットをリベースしない以外に)?

4

8 に答える 8

10

これは解決策ではありませんが、私が使用している現在の回避策です...

あなたの最初の例を使用して:

*   22c1fe6 (HEAD, master) Merge commit 'b6e698d9f4985825efa06dfdd7bba8d2930cd40e' as 'lib/mylib' - 
|\                                                                                                                
| * b6e698d Squashed 'lib/mylib/' content from commit d7dbd3d
* b99d55b Add readme
* 020e372 Initial

サブツリーを追加する前に、対話的に 2 番目のコミットにリベースします。

$ git rebase -i 020e372

2 つのサブツリー エントリを削除し、前のコミットの編集をマークします。

e b99d55b Add readme

ファイルを保存して閉じ、「Readme の追加」コミットに到達したら、修正コマンドを実行します。

$ git commit --amend

次に、新しいサブツリーを再度追加します。

$ git subtree add -P lib/mylib myliborigin master

リベースを続行します。

$ git rebase --continue

次に、ブランチを master からリベースする必要があり、サブツリーは Squash + Merge がそのままの状態で「通常」になります。

*   22c1fe6 (HEAD, master) Merge commit 'b6e698d9f4985825efa06dfdd7bba8d2930cd40e' as 'lib/mylib' - 
|\                                                                                                                
| * b6e698d Squashed 'lib/mylib/' content from commit d7dbd3d
于 2014-04-15T21:19:38.843 に答える
3

どうやらこれは予想される動作です(「予想される動作」のいくつかの誤った定義について)。http://git.661346.n2.nabble.com/subtree-merges-lose-prefix-after-rebase-td7332850.htmlを参照してください。

これは誰にとっても大いに役立つというわけではありません。私もこれの回避策を見つけたいと思います。

于 2012-11-30T06:33:17.877 に答える
2

同様の問題がありました。サブツリーの追加を行った後にリベースしたかったのですが、 --preserve-merges を使用すると、マージの競合が残りました (.gitignoreファイルの競合などによる)。

私の場合、必ずしもサブツリー機能を使用する予定はありませんでした。もともとスーパープロジェクトの一部であったはずのリポジトリを単にプルしただけでした。それが他の誰かを助ける場合に備えて、私が見つけた他の関連する 回答に基づいて、私がやったことは次のとおりです。

同じディレクトリに main_project と sub_project という 2 つのプロジェクトがあるとします。どちらのレポにも sub_project という名前のディレクトリがないと仮定して、sub_project を main_project 内の sub_project という名前のディレクトリにプルしたいと考えています。

cd main_project
git fetch ../sub_project
git checkout -b sub_project FETCH_HEAD
git filter-branch --prune-empty --tree-filter '
    if [[ ! -e sub_project ]]; then
        mkdir -p sub_project
        git ls-tree --name-only $GIT_COMMIT | xargs -I files mv files sub_project
    fi'
git checkout branch-to-merge-within
git merge sub_project
git branch -d sub_project

このアプローチで問題が見つかった場合は更新します。

于 2013-06-05T21:01:30.767 に答える
0

使用する必要があります

git rebase --preserve-merges --preserve-committer --onto new_place start end
于 2012-10-13T01:09:57.720 に答える