Añadir y eliminar confirmaciones Git que se encuentran en ninguna de las ramas (colgando?)

StackOverflow https://stackoverflow.com/questions/3765234

  •  04-10-2019
  •  | 
  •  

Pregunta

Tengo un repositorio Git con un montón de confirmaciones que se encuentran bajo ninguna rama en particular, puedo git show ellos, pero cuando trato de las ramas de la lista que los contienen, se informa nada.

pensé que esto es el / la cuestión árbol compromete colgando (como resultado de la rama -D), por lo que podado el repositorio, pero todavía ver el mismo comportamiento después de eso:

$ git fetch origin

$ git fsck --unreachable
$ git fsck

No hay salida, no hay nada colgando (¿verdad?). Pero existe el commit

$ git show 793db7f272ba4bbdd1e32f14410a52a412667042
commit 793db7f272ba4bbdd1e32f14410a52a412667042
Author: ...

y no es accesible a través de cualquiera de las ramas como

$ git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

da ninguna salida.

¿Qué es exactamente el estado de ese cometido? ¿Cómo puedo obtener una lista todos los envíos en un estado similar? ¿Cómo puedo eliminar interna como esos?

¿Fue útil?

Solución

No hay salida, no hay nada colgando (¿verdad?)

Tenga en cuenta que compromete a que se refiere desde su reflog se considera alcanzable.

¿Qué es exactamente el estado de ese cometido? ¿Cómo puedo obtener una lista con todos los envíos estado similar

Pass --no-reflogs para convencer git fsck para mostrar a usted.

¿Cómo puedo eliminar interna como esos?

Una vez que sus entradas reflog se cumplan, estos objetos serán entonces también ser limpiadas por git gc.

caducidad está regulada por la configuración gc.pruneexpire, gc.reflogexpire y gc.reflogexpireunreachable. Cf. git help config .

Los valores por defecto son bastante razonable.

Otros consejos

Para eliminar todos los envíos que cuelgan y los accesos a las reflogs hacer esto:

git reflog expire --expire-unreachable=now --all
git gc --prune=now

Sin embargo, tener la certeza de que esto es lo que desea. Le recomiendo que lea las páginas de manual, pero aquí está el quid:

git gcremoves inalcanzables objetos (cometa, árboles, gotas (archivos)). Un objeto es inalcanzable si no es parte de la historia de alguna rama. En realidad es un poco más complicado:

git gc hace algunas otras cosas, pero no son relevantes aquí y no es peligroso.

objetos inalcanzables que son menores de dos semanas no se eliminan por lo que utilizar --prune=now que significa "eliminar objetos inalcanzables que se crearon antes de ahora".

Los objetos pueden también ser alcanzados a través de la reflog. Mientras que las ramas registran la historia de algún proyecto, reflogs registran la historia de estas ramas. Si usted enmienda, etc. restablecer confirmaciones se eliminan de la historia, pero la rama git los mantiene alrededor en caso de que se da cuenta de que ha cometido un error. Reflogs son una forma conveniente para averiguar lo que se realizaron destructivos (y otros) para las operaciones en una rama (o la cabeza), por lo que es más fácil de deshacer una operación destructiva.

Así que también tenemos que quitar los reflogs para realmente eliminar todo lo que no puede llegar de una rama. Lo hacemos al expirar reflogs --all. Una vez más Git mantiene un poco de las reflogs a los usuarios a proteger lo que de nuevo tenemos que decir que no hacerlo:. --expire-unreachable=now

Desde que uso principalmente el reflog para recuperarse de operaciones destructivas Yo suelo usar --expire=now lugar, que electrocuta a los reflogs por completo.

Yo tenía el mismo problema, aún después de seguir todos los consejos en este hilo:

git reflog expire --expire-unreachable=now --all
git gc --prune=now
git fsck --unreachable --no-reflogs   # no output
git branch -a --contains <commit>     # no output
git show <commit>                     # still shows up

Si no es un reflog y no una rama, ... debe ser una etiqueta

git tag                             # showed several old tags created before the cleanup

Me quita las etiquetas con git tag -d <tagname> y volvió a hacer la limpieza, y las viejas compromete habían desaparecido.

git branch --contains 793db7f272ba4bbdd1e32f14410a52a412667042

Probablemente sólo tiene que ser

git branch -a --contains 793db7f272ba4bbdd1e32f14410a52a412667042

para informar también sobre las ramas de los mandos a distancia

Yo tenía un problema similar. Corrí git branch --contains <commit>, y no hay ningún producto al igual que en la pregunta.

Pero incluso después de ejecutar

git reflog expire --expire-unreachable=now --all
git gc --prune=now

Mi cometer seguía siendo accesible a través de git show <commit>. Esto se debió a una de las confirmaciones en su colgaba "rama" / extraíble fue etiquetado. He quitado la etiqueta, corriendo los comandos anteriores de nuevo, y yo era de oro. git show <commit> fatal: bad object <commit> regresado - exactamente lo que necesitaba. Espero que esto ayude a alguien más que era tan pegado como yo.

git gc --prune=<date> valores por defecto para podar los objetos más antiguos que hace dos semanas. Se podría establecer una fecha más reciente. Pero, los comandos de Git que crean objetos sueltos generalmente se ejecutarán git gc --auto (que ciruelas pasas pierden objetos si su número supera el valor de gc.auto variable de configuración).

¿Está seguro que desea eliminar estas confirmaciones? El ajuste predeterminado de gc.auto se asegurará de que los objetos sueltos no ocupan una cantidad razonable de memoria y almacenamiento de objetos sueltos para una cierta cantidad de tiempo es generalmente una buena idea. De esta manera, si se da cuenta de que su rama mañana eliminados contenían una confirmación que es necesario, puede recuperarla.

Me golpeó accidentalmente la misma situación y encontró mis escondites contienen referencia a la inalcanzable cometer, y por lo tanto el presunto inalcanzable comprometen era accesible desde alijos.

Estos fueron lo que hice para que sea realmente inalcanzable.

git stash clear
git reflog expire --expire-unreachable=now --all
git fsck --unreachable
git gc --prune=now
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top