web-dev-qa-db-ja.com

Gitリポジトリの履歴から空のマージコミットを削除します

Gitリポジトリをかなりクリーンアップしたので、履歴から大きな部分を削除する必要があります。私はこれを使用して行います:

git filter-branch --Prune-empty --tree-filter 'rm -rf some_stuff'

--Prune-emptyフラグは、複数の親を持つコミット(マージコミット)を除いて、プロセス後に空のままになっているコミットを削除します。マージされるブランチにまったく何も含まれておらず、マージによってツリーに何も追加されない場合でも。

これらの空のマージコミットを履歴から削除するにはどうすればよいですか?

41

これはリベースソリューションよりも優れています。これはコミッター情報、コミッター日付、および空でないマージ元の履歴の。

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のバージョンです。

40
raphinesse

ssokolow/profile のコピーでfilter-branchを実行した後、これを実行して、 ssokolow/lap を分離する必要がありました。

これは、自動的に「--Prune-emptyによって痕跡を残したものをすべて折りたたむ」コマンドとして適切な仕事をしました。

git rebase --root HEAD

--rootが必要だったので、空になった最初のコミットを、まだコンテンツが残っている最も古いコミットに置き換えます。)

11
ssokolow

これは私にとってはうまくいったようです: 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(' ') 
3
Lucas W

したがって、私の解決策は、すべてをサブディレクトリに(歴史的に)移動してから--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

そしてそれを押します。

0
eligro