12

git-subtreeプロジェクトからディレクトリを抽出するために使用しています。

git subtree split --prefix=src/SubProject --branch=SubProject origin/master

これが最初にプロジェクトを開始したい方法であるとすれば(具体的には no ) 、連続した実行でからへ--rejoinの変更のみを分割するにはどうすればよいですか?origin/masterSubProject

小規模なプロジェクトの場合、これはうまく機能しています。プロジェクトを分割するのに 5 秒ほどかかります。ただし、大規模なリポジトリでは、これにはかなりの時間がかかる場合があります。分割ごとに最大5分かかることがわかりました。私が取り組みたいプロジェクトの中には、1 つのリポジトリに 45 以上のサブプロジェクトがあるものがあります。

うまくいくかもしれないと思った多くのことを試しましたが、それぞれが何らかの形で失敗しました。私の要件は次のとおりです。

  • 決していじってorigin/masterはいけません(そのため、ほとんどの場合--rejoin、問題外です)
  • 余分なマージ コミットを追加してはなりません (考えてみてください:--ff-onlyから新しい変更を取得するときorigin/master) 。
  • SubProjectリポジトリには安定したコミット ID が必要です。への 1 つまたは複数の増分更新の後SubProject、この投稿の上部にある元のコマンドを再実行した場合に取得されるのと同じコミット ID が履歴に含まれている必要があります。
  • 自動化する必要があり、手動による介入は必要ありません

複雑なソリューションを恐れていませんが、自動化する必要があります。履歴の変更による失敗は問題ありません。その時点で、スクリプトはフォールバックして全体をゼロから構築できます。その場合、ユーザーは自分が何をしたかを知っているので、最初から再構築するという非常に長いプロセスを経なければなりません。:)

--再参加

によって追加された変更された履歴のコンテナーになるように、 around--rejoinの余分なコピーを使用して保持しようとしました。ここで私が遭遇した問題は、介入することも介入することもできなかったことです。自動化された方法でこれを行う必要があるため、これは受け入れられませんでした。origin/master--rejoingit rebase origin/mastergit merge --ff-only origin/master

マージコミット

思い通りに動作させることができましgit merge origin/masterたが、マージコミットが発生しました。このマージ コミットは上流に行くことはないので、今後の履歴を予測することは不可能git subtree splitであり、元の環境での新しいものは同じ正確な履歴を再現することはできません。私はこれについて間違っている可能性があります。もしそうなら、これがどのように安全になるかを私に説明してください. :)

コミット範囲

コミット範囲を使用して実験したSubProjectところ、特定の時点からHEAD. これは、コミット ID の新しいセットを生成するように見える場合を除いて、おそらく機能するため、これはオプションではないと思います。

4

1 に答える 1

3

これを簡単にプレイできるようにパッチを実装しました。subtree split他に親がいない場合に埋められる親を明示的に指定できるようになりました。

$ git init
$ for i in {1..100}; do
   echo $i >q
   git add q
   git commit -m $i
   mkdir -p qqq
   echo $i > qqq/w
   git add qqq/w
   git commit -m "qqq/$i"
done

$ # let's do full split
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
    --prefix=qqq --branch qqq HEAD
...7/200 (6)...58/200 (57)...142/200 (141)...176/200 (175)...
Created branch 'qqq'
f5120d3e676e2966802c8829b13a34c8d0c2dac4

$ # now let's do partial split
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
    --prefix=qqq --branch qqq2 HEAD~100
...20/100 (19)...
Created branch 'qqq2'
3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52

$ # Now let's "continue the work" on qqq2
$ /home/vi/src/git/git/contrib/subtree/git-subtree.sh split \
   --prefix=qqq --branch qqq2 \
   --graft-parent=3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52 \
   HEAD~100..HEAD
Grafting 3632fb9fc5c7a7f0b4bf8c6743e2cd372a6d8e52\n
...10/100 (9)...
Updated branch 'qqq2'
f5120d3e676e2966802c8829b13a34c8d0c2dac4
于 2013-05-07T02:10:54.993 に答える