Gitリポジトリをかなりクリーンアップしたので、履歴から大きな部分を削除する必要があります。私はこれを使用して行います:
git filter-branch --Prune-empty --tree-filter 'rm -rf some_stuff'
--Prune-empty
フラグは、複数の親を持つコミット(マージコミット)を除いて、プロセス後に空のままになっているコミットを削除します。マージされるブランチにまったく何も含まれておらず、マージによってツリーに何も追加されない場合でも。
これらの空のマージコミットを履歴から削除するにはどうすればよいですか?
これはリベースソリューションよりも優れています。これはコミッター情報、コミッター日付、および空でないマージ元の履歴の。
git filter-branch --Prune-empty --parent-filter \
'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'
これは、Lucasのソリューションと同じ カーネルメーリングリストのスレッド に触発されています。ただし、Rubyを必要とせず、ワンライナーです。does require GNU xargs
およびsed
のバージョンです。
ssokolow/profile のコピーでfilter-branch
を実行した後、これを実行して、 ssokolow/lap を分離する必要がありました。
これは、自動的に「--Prune-empty
によって痕跡を残したものをすべて折りたたむ」コマンドとして適切な仕事をしました。
git rebase --root HEAD
(--root
が必要だったので、空になった最初のコミットを、まだコンテンツが残っている最も古いコミットに置き換えます。)
これは私にとってはうまくいったようです: http://git.661346.n2.nabble.com/Removing-useless-merge-commit-with-quot-filter-branch-quot-td7356544.html
git filter-branch -f --Prune-empty --parent-filter FULL_PATH_TO/rewrite_parent.rb master
rewrite_parent.rb
:
#!/usr/bin/Ruby
old_parents = gets.chomp.gsub('-p ', ' ')
if old_parents.empty? then
new_parents = []
else
new_parents = `git show-branch --independent #{old_parents}`.split
end
puts new_parents.map{|p| '-p ' + p}.join(' ')
したがって、私の解決策は、すべてをサブディレクトリに(歴史的に)移動してから--subdirectory-filter
最初のステップ gitリポジトリをサブディレクトリに結合する際のエラー
Shファイルを少し変更しました。
#!/bin/bash
git ls-files -s | sed "s-\t-&temp_dir/-" | GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE" || true
実行
git filter-branch --index-filter '~/doit.sh' HEAD
第二段階
git filter-branch --subdirectory-filter temp_dir --Prune-empty
そしてそれを押します。