2012-03-21 15 views
32

He limpiado bastante nuestro repositorio de Git, tenemos que eliminar partes grandes del historial. Lo hago usando:Podar compromisos de fusión vacía de la historia en el repositorio de Git

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

La bandera --prune-empty eliminará confirmaciones que quedan vacías después del proceso, excepto las confirmaciones con múltiples padres (fusionar commit). Incluso si la rama que se fusiona no contiene absolutamente nada, y la fusión no agrega nada al árbol.

¿Cómo puedo también eliminar estas confusiones de fusión vacías del historial?

Respuesta

0

me encontré con un pequeño script muy linda envoltura alrededor de filtro de sucursal aquí:

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

Preconds y antecedentes aquí:

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

+0

No funciona. De 'man git filter-branch':" También puede usar git_commit_non_empty_tree "$ @" en lugar de git commit-tree "$ @" si no desea mantener las confirmaciones con un solo padre y eso no hace cambios en el árbol." Pero los commit de fusión tienen múltiples padres. Por lo tanto, hace lo mismo que el indicador '--prune-empty'. Lo intenté, y no poda las confusiones de fusión vacías. :/ –

+0

Aah bien, maldición. Se necesita más investigación entonces. Brb. – ralphtheninja

+0

Echa un vistazo a esa secuencia de comandos de contenedor. – ralphtheninja

0

Así que mi solución está moviendo todo para sub- dir (históricamente) y luego --subdirectory-filter

Primer paso error combining git repositories into subdirs

he modificado un poco el archivo 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 

plazo

git filter-branch --index-filter '~/doit.sh' HEAD 

segundo paso

git filter-branch --subdirectory-filter temp_dir --prune-empty 

y empujarlo.

10

Necesito hacer esto después de ejecutar filter-branch en una copia de ssokolow/profile para separar ssokolow/lap.

Este hizo un trabajo decente como un "colapso de distancia queda algo rudimentaria por --prune-empty" automático comando:

git rebase --root HEAD 

(necesitaba el --root por lo que sustituiría a la inicial que ha quedado vacío comprometerse con la más antigua que se todavía tenía contenido)

+0

Útil, aunque exagerado en algunas situaciones. Vale la pena señalar que este enfoque aplana * todas * fusiones, no solo las vacías. –

+1

Tenga en cuenta también que esto restablece el GIT_COMMITTER_DATE como lo que git rebase hace de forma predeterminada. –

+0

@ ElanRuusamäe: ¿Conoces una forma de evitar eso (es decir, mantener la información original del commiter)? – Thilo

3

Esto parece que funcionó para mí:. 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(' ') 
20

Ésta es superior a la solución de rebase porque conserva información confirmador, fechas committers y fusiones que no estén vacíos de la historia inicial.

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

Esto es inspirada por el mismo thread on the kernel mailing list de solución Lucas'. Sin embargo, no requiere Ruby y es de una sola línea.Es does requieren versiones GNU de xargs y sed sin embargo.

+1

La solución más simple para mí, porque no se necesitan scripts externos. – krlmlr

+1

En OSX 'sed" s/-p // g "| xargs git show-branch --independiente | sed "s/^/- p/g" | tr "\ n" "" 'parece funcionar para mí –

+1

No elimina las asignaciones de fusión del árbol inferior, es decir, fusión de dos confirmaciones vacías (cada una sin antecesor) – Tomas

Cuestiones relacionadas