23

それぞれに1つのファイルを含むgitリポジトリがたくさんあります。できれば1つのステップで、それらをすべてマージしたいと思います。私が目指しているのは、このグラフです:

*----¬ mergedrepo/master
| \ \ \
| | | * repoA/master
| | * repoB/master
| | |
| | * repoB/...
| * repoC/master
* repoD/master
|
* repoD/...

を試しましたgit mergeが、タコの戦略はバラバラの木では機能しないようです

$ git merge a/master b/master c/master d/master
Unable to find common commit with a/master
Automatic merge failed; fix conflicts and then commit the result.

git merge --squashそれも役立つと言われましたが、同じエラーが発生しました。

これにより正しいグラフが生成されますが、すべてのファイルが失われます。

$ git merge -s ours a/master b/master c/master d/master

どうすればこれを行うことができますか?

4

4 に答える 4

21

関係のないブランチのタコのマージに関する問題を解決することができました。残念ながら、以下は実際のマージ競合が存在しないかなり単純なケースにのみ適用されます。

  1. OPで説明されているようにマージを行います。

    git merge --allow-unrelated-histories a/master b/master c/master d/master

    競合についての主張は「失敗」します。しかし、インデックスに変更はありませんが、マージが実行され、その事実が記録されています。

  2. read-tree次のコマンドを使用して、ブランチの内容をインデックスに追加します。

    git read-tree a/master b/master c/master d/master

    これは作業ツリーには影響せず、インデックスのみが更新されます。(現在のブランチを最後に追加したい場合があります。それらすべてを 1 つのコマンドで追加する必要があります。)

    ブランチが完全に独立していない場合は、後者が前のブランチの内容を上書きすることを念頭に置いて順序を調整します。

  3. 普通にコミットします。( git commit -m "octopus-merged remote 'a', 'b', 'c', 'd'")
  4. ハード リセット ( git reset --hard) を実行して、一貫した作業ツリーを取得します。

後でこのコミットを編集して修正できると思いますが、個人的には試していません。

于 2015-07-02T14:02:35.157 に答える
4

空のコミットを作成する

git commit -m "Common commit" --allow-empty

でそのハッシュを見て、log -1親なしで接ぎ木ファイルに追加します

echo HASH_OF_COMMON_COMMIT >> .git/info/grafts

次に、他のすべてのルートを検索しlog --max-parents=0、それぞれについて、上記のハッシュを親としてグラフト ファイルにハッシュを追加します。

each HASH_OF_ROOT HASH_OF_COMMON_COMMIT >> .git/info/grafts

そして今、マージ!

移植ファイルは、コミットの親を変更する方法であり、すべてのリポジトリに共通のコミットがあると、リポジトリはマージを受け入れる必要があります。

于 2012-11-28T06:23:39.463 に答える