Подтвердить что ты не робот

Сокращение пустого слива завершается из истории в репозитории Git

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

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

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

Как я также обрезаю эти пустые записи слияния из истории?

4b9b3361

Ответ 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

и нажмите.