Сокращение пустого слива завершается из истории в репозитории Git
Я немного очистил наш репозиторий Git, нам нужно удалить большие части из истории. Я делаю это, используя:
git filter-branch --prune-empty --tree-filter 'rm -rf some_stuff'
Флаг --prune-empty
удаляет коммиты, оставшиеся пустыми после процесса, за исключением того, что совершается с несколькими родителями (слияния). Даже если ветка, в которую сливается, не содержит абсолютно ничего, и слияние ничего не добавляет к дереву.
Как я также обрезаю эти пустые записи слияния из истории?
Ответы
Ответ 1
Я нашел очень симпатичную маленькую обертку script вокруг фильтра-ветки здесь:
https://github.com/pflanze/chj-bin/blob/master/cj-git-filter-branch
Презервативы и фон здесь:
http://lists.q42.co.uk/pipermail/git-announce/2011-September/000486.html
Ответ 2
Это лучше, чем решение для восстановления, потому что сохраняет информацию коммиттера, даты коммиттера и непустые сливки исходной истории.
git filter-branch --prune-empty --parent-filter \
'sed "s/-p //g" | xargs -r git show-branch --independent | sed "s/\</-p /g"'
Это вдохновляет тот же поток в списке рассылки ядра, чем решение Lucas. Однако он не требует Ruby и является однострочным. Он действительно требует версии GNU xargs
и sed
.
Ответ 3
Мне нужно было сделать это после запуска filter-branch
на копии ssokolow/profile, чтобы выделить ssokolow/lap.
Это сделало достойную работу как автоматическое "свернуть все, что осталось рудиментарным с помощью команды --prune-empty
":
git rebase --root HEAD
(мне понадобился --root
, чтобы он заменил теперь пустой исходный коммит самым старым, у которого все еще был контент.)
Ответ 4
Похоже, это сработало для меня: 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(' ')
Ответ 5
Итак, мое решение перемещает все в 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
run
git filter-branch --index-filter '~/doit.sh' HEAD
второй шаг
git filter-branch --subdirectory-filter temp_dir --prune-empty
и нажмите.