Удалить пустые коммиты слияния из истории в репозитории Git - PullRequest
38 голосов
/ 21 марта 2012

Я немного очистил наш Git-репозиторий, нам нужно удалить большие части из истории. Я делаю это используя:

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

Флаг --prune-empty удаляет коммиты, которые остаются пустыми после процесса, за исключением коммитов с несколькими родителями (коммит слияния). Даже если объединяемая ветвь не содержит абсолютно ничего, а объединение ничего не добавляет к дереву.

Как мне также удалить эти пустые коммиты слияния из истории?

Ответы [ 5 ]

31 голосов
/ 17 июля 2016

Это превосходит решение для перебазирования , поскольку оно сохраняет информацию о коммиттере, даты коммиттера и непустые слияния исходной истории.

git filter-branch --prune-empty --parent-filter \
    'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'

Это связано с тем же потоком в списке рассылки ядра , что и решение Лукаса. Однако он не требует Ruby и является однострочным. требует версии GNU xargs и sed.

11 голосов
/ 02 июля 2014

Мне нужно было сделать это после запуска filter-branch для копии ssokolow / profile , чтобы выделить ssokolow / lap .

Это проделало достойную работукак автоматическое «свернуть все, что осталось от рудимента», командой --prune-empty:

git rebase --root HEAD

(мне нужен --root, поэтому он заменит пустую первоначальную фиксацию самой старой, в которой все еще содержалось содержимое.)

3 голосов
/ 16 декабря 2015

Похоже, это сработало для меня: 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(' ') 
0 голосов
/ 09 января 2014

Итак, мое решение перемещает все в sub-dir (исторически), а затем --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 голосов
/ 21 марта 2012

Я нашел очень милый маленький скрипт-обертку вокруг ответвления фильтра здесь:

https://github.com/pflanze/chj-bin/blob/master/cj-git-filter-branch

Преконденс и фон здесь:

http://lists.q42.co.uk/pipermail/git-announce/2011-September/000486.html

...