repositorio - git push tag
Podar compromisos de fusión vacía de la historia en el repositorio de Git (5)
Encontré un pequeño script muy lindo envoltorio alrededor de la rama filtro aquí:
https://github.com/pflanze/chj-bin/blob/master/cj-git-filter-branch
Segundos y antecedentes aquí:
http://lists.q42.co.uk/pipermail/git-announce/2011-September/000486.html
He limpiado bastante nuestro repositorio Git, necesitamos eliminar partes grandes del historial. Lo hago usando:
git filter-branch --prune-empty --tree-filter ''rm -rf some_stuff''
El --prune-empty
eliminará los commits que quedan vacíos después del proceso, excepto commits con múltiples padres (merge commits). 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 de la historia?
Entonces mi solución está moviendo todo a subdirectorio (históricamente) y luego a --subdirectory-filter
Error de primer paso que combina repositorios git en subdirectorios
Modifiqué 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
correr
git filter-branch --index-filter ''~/doit.sh'' HEAD
segundo paso
git filter-branch --subdirectory-filter temp_dir --prune-empty
y empujarlo.
Esto es superior a la solución de rebase porque conserva la información del committer, las fechas del committer y las fusiones no vacías del historial original.
git filter-branch --prune-empty --parent-filter /
''sed "s/-p //g" | xargs -r git show-branch --independent | sed "s//</-p /g"''
Esto está inspirado en el mismo hilo en la lista de correo del kernel que la solución de Lucas. Sin embargo, no requiere Ruby y es de una sola línea. Sin embargo, requiere versiones de GNU de xargs
y sed
.
Necesitaba hacer esto después de ejecutar filter-branch
en una copia de ssokolow/profile para separar ssokolow/lap .
Esto hizo un trabajo decente como un comando automático "colapsar todo lo que quedaba vestigial por" --prune-empty
":
git rebase --root HEAD
(Necesitaba la --root
para que reemplazara la confirmación inicial ahora vacía con la más antigua que aún tenía contenido).
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('' '')