2

シンプルなアプリの完全なソースコードがあり、それに基づいて教材を作成する必要があります。そこで、完全なソースからgitリポジトリを初期化し、逆の順序でパーツの単純化と削除を開始し、「Hello、World!」だけになるまで、その後の単純化された各バージョンをコミットすることを考えていました。残っています。

質問:gitリポジトリでコミットを元に戻し、コミットメッセージを保持して、元々この順序でコミットされたように見せるためにどのようにしたらよいですか?

最終結果がgitリポジトリである限り、他のVCSを使用して単純化の部分を実行することは許容されます。

4

4 に答える 4

2

私はgit format-patchパッチをファイルに取得し、それらを時系列に沿って並べ替えて(ファイル名に番号を付けてからsort -r)、を使用して新しい空のリポジトリに新しいコミットとして適用するために使用しgit apply --reverseます。次に、インタラクティブなリベース(-i)を使用して、詳細を修正し、メッセージをコミットします。

とにかく、履歴を使って簡単に操作できるので、gitはこのための優れたツールですが、いくつかの作業が必要になります。

編集:

後でこれを見たとき、私はこれを行う方法についてより良い考えを持っています。基本原則は変更せず、実装のみを変更します。

マスターブランチに履歴のあるリポジトリがあることを期待しています。現在のHEADにコミットをミラーリングする最も簡単な方法は次のとおりです。

git checkout -b mirror
git log --format=%H | xargs -n 1 git revert

これで、マスターブランチに古い履歴があり、マスターとミラー間の新しいコミットはマスターからのコミットが逆になります。鏡を見ているように。古い履歴を切り取ってコミットメッセージを編集したいと思うので、楽しんでgit rebase -iください。

于 2013-02-03T13:15:46.910 に答える
2

gitリポジトリのすべてのブランチを完全に逆にするスクリプト「git-reverse.sh」を作成しました。

の組み合わせを使用してgit log --pretty="%T"、ツリーハッシュを抽出git commit-treeし、元のツリーオブジェクト(ファイル)に対して新しいコミットオブジェクトを作成しますが、親のエッジは逆になります。

いくつかのリポジトリでスタックしているようです。どうしてか分かりません。

あなたはここでそれを見つけることができます:

https://github.com/gsylvie/git-reverse.sh

使用例

git clone --mirror [git-clone-url]
cd [repo.git]
./git-reverse.sh
git log --all --date-order --graph --decorate

出力例

$ ./git-reverse.sh 
be0923ece8f73281e5e54906c29debb852894b92 - Reversed 1 of 360 (0%)
061bca59b29e75becbde66d2e510fc2b4059ccb2 - Reversed 2 of 360 (0%)
6a19039e05e3a0186187d0a6943634e8499b5a65 - Reversed 3 of 360 (0%)
7afe25e8caf93eb7107471a1bd078d4adc3f6999 - Reversed 4 of 360 (1%)
8b556f6fe97c5357c2328467a5ba01b77931ff82 - Reversed 5 of 360 (1%)
71fd0883975154f48059ca929db8ccb659c5049a - Reversed 6 of 360 (1%)
[etc...]
Switched to branch 'master'
Your branch and 'origin/master' have diverged,
and have 199 and 159 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

*********************************************
| Git repo successfully reversed!!! :-) (-: |
*********************************************
To push the reversed repo:
  rm .git/packed-refs
  rm -rf .git/refs/remotes
  git push --mirror [new-git-clone-url]  

WARNING:
========
Pushing a reversed git repo is a profoundly destructive and confusing operation.

You have a full 'git clone --mirror' backup stored somewhere safe, right?
于 2017-04-01T22:05:34.223 に答える
1

リポジトリ内のコミット数が限られている場合(教材を作成している場合もそうだと思います)、手動で逆の順序でチェリーピックを実行するだけでよいと思います。

A <- B <- C <- D <- E
                    ^HEAD

Aが空の最初のコミットであり、Bがファイルの完全なセットであり、CDEが徐々にファイルを削除していると仮定すると、Aの別のブランチから開始できると思います。

A <- B <- C <- D <- E
^NewHead            ^HEAD

チェリーピックE、D、C、Bからニューヘッドへ:

A <- B <- C <- D <- E
 ^                  ^HEAD
  \- E' <- D' <- C' <- B'
                       ^NewHead

もちろん、コミットが本当にたくさんある場合は、パッチをエクスポートし、スクリプトを使用してインポートする前にそれらを操作する方が良い選択かもしれません(他の回答で示唆されているように)

于 2013-02-04T05:01:46.447 に答える
0

まず第一に、なぜコミットを変更する必要があるのか​​わかりません。対応するバージョンを任意の順序でチェックアウトできます。つまりgit checkout master~1、show 、、 show、git checkout master~2など。

履歴を取得するために本当に必要な場合は、履歴revertを再生するものを使用してみてください。たとえばgit revert HEAD~5..HEAD、最後の5つのコミットを逆の順序で元に戻します。ただし、それはであるというコミットメッセージを生成しますRevert "old commit message"。ただし、メッセージを修正するスクリプトを作成することはできます。

于 2013-02-04T09:52:19.683 に答える