34

私は非常に大きなGitリポジトリを持っており、かなり頻繁に変更されるバイナリファイルのみが含まれています。当然、Gitリポジトリは実際のファイルよりもはるかに大きくなります。古い履歴はあまり気にしません。間違った変更を元に戻すには、新しい履歴の一部だけが必要です。したがって、最後の5つを除くすべてのコミットを削除したいとします。

当然、リポジトリを小さく保つためにこれを実行したいので、削除されたコミットはリポジトリから完全に削除する必要があります。

そして、これらすべてを1つのコマンド(エイリアス)またはスクリプトで非対話的に実行したいと思います。これどうやってするの?

4

2 に答える 2

18

rebase-last-five開始するためのエイリアスを次に示します。現在のブランチが再作成されるため、履歴には最新の 5 つのコミットのみが含まれます。これgit-rebase-last-five.shを、 のディレクトリで使用できるスクリプト ()にするのがおそらく最善PATHです。git-....shGit は、特別な構成を必要とせずに名前が付けられたスクリプトを見つけて使用します。スクリプトは、この単純なエイリアスよりも多くのエラー チェックと処理を行う必要があります。

$ git config --global alias.rebase-last-five '!b="$(git branch --no-color | cut -c3-)" ; h="$(git rev-parse $b)" ; echo "Current branch: $b $h" ; c="$(git rev-parse $b~4)" ; echo "Recreating $b branch with initial commit $c ..." ; git checkout --orphan new-start $c ; git commit -C $c ; git rebase --onto new-start $c $b ; git branch -d new-start ; git gc'

注意事項:履歴の変更に関する警告に注意してください。

詳細については、manページ (git help <command>またはオンライン) を確認してください。

使用例:

$ git --version
git version 1.7.12.rc2.16.g034161a
$ git log --all --graph --decorate --oneline
* e4b2337 (HEAD, master) 9
* e508980 8
* 01927dd 7
* 75c0fdb 6
* 20edb42 5
* 1260648 4
* b3d6cc8 3
* 187a0ef 2
* e5d09cf 1
* 07bf1e2 initial
$ git rebase-last-five 
Current branch: master e4b2337ef33d446bbb48cbc86b44afc964ba0712
Recreating master branch with initial commit 20edb42a06ae987463016e7f2c08e9df10fd94a0 ...
Switched to a new branch 'new-start'
[new-start (root-commit) 06ed4d5] 5
 1 file changed, 1 insertion(+)
 create mode 100644 A
First, rewinding head to replay your work on top of it...
Applying: 6
Applying: 7
Applying: 8
Applying: 9
Deleted branch new-start (was 06ed4d5).
Counting objects: 35, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (35/35), done.
Total 35 (delta 4), reused 0 (delta 0)
$ git log --all --graph --decorate --oneline
* a7fb54b (HEAD, master) 9
* 413e5b0 8
* 638a1ae 7
* 9949c28 6
* 06ed4d5 5
于 2012-08-13T15:08:04.767 に答える
9

わかりました、私があなたが望むと思うものが欲しいなら(私のコメントを見てください)、これはうまくいくはずです:

  1. すべてのコミットを保存するブランチを作成します (念のため):

    git branch fullhistory

  2. マスターにいる間に、履歴を保持したいコミットに --hard をリセットします。

    git reset --hard HEAD~5

  3. 履歴の先頭に戻らずにリセットする--hardと、ワークスペースはそのまま残り、HEAD~5 状態のままになります。

    git reset --soft <first_commit>

  4. これでmaster、 の履歴が空になり、ワークスペースで必要なすべての変更が行われました。それらをコミットするだけです。

    git commit -m "all the old changes squashed"

  5. fullhistoryここで、ここに入れたい4 つのコミットを選択します。

    git cherry-pick A..B

A が B よりも古い場合、A は含まれていないことに注意してください。したがって、含めたい最も古いコミットの親である必要があります。

于 2012-08-13T09:52:38.150 に答える