reflogの再構築は、最初に表示されるほど難しくない場合があります。reflogのコミットを個別のブランチに再生成することも、 reflogの一部を含むgit read-tree
シングルを生成するために使用することもできますnewbranch
。
ブランチソリューションごとに1つのコミット:
コミットごとに個別のブランチが必要だとします。まず、リポジトリをコピーします。このプロセスでreflogを変更するので、使い捨てバージョンを使用することをお勧めします。次に、reflogを調べて、開始するコミットを見つけます。のようになりますHEAD@{n}
。だったとしましょうHEAD@{49}
。head -50
次に、このスクリプトを試して、を置き換えてhead -<n + 1>
ください。
#!/bin/sh
reflog=$(git reflog | head -50 | awk '{ print $1 }')
i=0
for ref in $reflog; do
git checkout -B "reflog_$i" $ref
i=$(expr $i + 1)
done
これは、reflogのコミット履歴を一度取得し、それを繰り返し処理してreflog_$i
、途中でブランチを生成します。好きなようにそれらをチェリーピック、マージ、または操作できます。これが単にプレゼンテーション用である場合はgit checkout
、ブランチで実行され、テストスイートを実行し、全体に緑を表示する短いスクリプトを作成できます。覚えておいてください、reflog_1
最新の歴史を表しています。reflog_<n+1>
最も古い。
#!/bin/sh
for i in $(seq 50 1); do
git checkout "reflog_$i"
./test-suite.sh
done
コミット方法を説明している間、それをプロジェクターに投げてください。それは素晴らしい背景になるでしょう。
すべてのブランチを結合する場合は、このrubyスクリプトを実行して、それらを順番に適用できます(または、使い慣れた言語で同等のものを作成できます)。これはかなり破壊的であるため、ディレクトリをバックアップする必要があることを繰り返し述べておきます。
#!/usr/bin/env ruby
n = 50
n.downto 0 do |i|
system "
git read-tree reflog_#{i}
git commit -m 'Refactoring #{n - i}'
git checkout -- .
git br -D refog_#{i}
"
end
を使用してすべてのコミットを同じブランチに配置するgit read-tree
まず、リポジトリをコピーします。次に、次のようなスクリプトを使用します。最初のソリューションの説明に従って、2つ<n + 1>
をreflogで必要な深さに変更し、さらに1つ変更します。への追加のパイプに注意してくださいsed
。reflogがnewbranch
時系列の逆順に適用されないように、それまたはそのようなものを使用する必要があります。awk
との両方を使用せずにこれを行う方法は確かにありますsed
が、これは機能します。
#!/bin/sh
reflog=$(git reflog | head -<n + 1> | awk '{ print $1 }' | sed -n '1!G;h;$p')
git checkout -B newbranch HEAD@{<n + 1>}
for ref in $reflog; do
git read-tree "$ref"
git commit --no-verify -m "Adding commit $ref"
git checkout -- .
done
最終結果はになります。これには、commitに基づいて、とのnewbranch
間のすべてのコミットが含まれている必要があります。HEAD@{0}
HEAD@{n}
HEAD@{n+1}