videos una repetidos repetidas programas programa porque para mis mejor mac los gratis fotos eliminar duplican duplicados como carpeta archivos git object duplicates

git - una - porque se duplican mis archivos en mac



El árbol contiene entradas de archivos duplicados (3)

La única solución que he encontrado es usar git-replace y git-mktree. No es la solución más fácil del mundo pero funciona.

Mira este enlace para una guía de referencia.

git tree contiene entradas de archivos duplicados

Después de algunos problemas con nuestro alojamiento, decidimos mover nuestro repositorio Git a GitHub. Así que cloné el repositorio e intenté enviarlo a GitHub. Sin embargo, me topé con algunos errores que nunca antes habíamos encontrado:

C:/repositories/appName [master]> git push -u origin master Counting objects: 54483, done. Delta compression using up to 2 threads. Compressing objects: 100% (18430/18430), done. error: object 9eac1e639bbf890f4d1d52e04c32d72d5c29082e:contains duplicate file entries fatal: Error in object fatal: sha1 file ''<stdout>'' write error: Invalid arguments error: failed to push some refs to ''ssh://[email protected]/User/Project.git''

Cuando corro fsck :

C:/repositories/appName [master]> git fsck --full Checking object directories: 100% (256/256), done. error in tree 0db4b3eb0e0b9e3ee41842229cdc058f01cd9c32: contains duplicate file entries error in tree 9eac1e639bbf890f4d1d52e04c32d72d5c29082e: contains duplicate file entries error in tree 4ff6e424d9dd2e3a004d62c56f99e798ac27e7bf: contains duplicate file entries Checking objects: 100% (54581/54581), done.

Cuando ejecuto ls-tree con el SHA1 malo:

C:/repositories/appName [master]> git ls-tree 9eac1e639bbf890f4d1d52e04c32d72d5c29082e 160000 commit 5de114491070a2ccc58ae8c8ac4bef61522e0667 MenuBundle 040000 tree 9965718812098a5680e74d3abbfa26f527d4e1fb MenuBundle

Intenté todas las respuestas ya dadas en esta pregunta de StackOverflow , pero no he tenido ningún éxito. ¿Hay alguna manera de evitar que este repositorio y su historia estén condenados?


Método 1.

Haz el git fsck primero.

$ git fsck --full error in tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29: contains duplicate file entries

Si esto no soluciona el problema, estás en problemas. Puede ignorar el problema, restaurar el repositorio desde la copia de seguridad o mover los archivos al nuevo repositorio. Si tiene problemas para empujar el repositorio en github, intente cambiar el repositorio a uno diferente o verifique: No se puede empujar a GitHub error: los objetos del paquete murieron de la señal 13 y No se puede empujar el nuevo repositorio de git a github .

Los siguientes métodos son solo para usuarios avanzados de git . Por favor, haga la copia de seguridad antes de comenzar. La solución no está garantizada por los siguientes pasos y puede empeorar las cosas, así que hágalo por su propio riesgo o con fines educativos.

Método 2.

Use git ls-tree para identificar archivos duplicados.

$ git read-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Just a hint. $ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Try also with: --full-tree -rt -l 160000 commit def08273a99cc8d965a20a8946f02f8b247eaa66 commerce_coupon_per_user 100644 blob 89a5293b512e28ffbaac1d66dfa1428d5ae65ce0 commerce_coupon_per_user 100644 blob 2f527480ce0009dda7766647e36f5e71dc48213b commerce_coupon_per_user 100644 blob dfdd2a0b740f8cd681a6e7aa0a65a0691d7e6059 commerce_coupon_per_user 100644 blob 45886c0eda2ef57f92f962670fad331e80658b16 commerce_coupon_per_user 100644 blob 9f81b5ca62ed86c1a2363a46e1e68da1c7b452ee commerce_coupon_per_user

Como puede ver, contiene las entradas de archivos duplicadas (commerce_coupon_per_user)!

$ git show bb81a5af7e9203f36c3201f2736fca77ab7c8f29 tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 commerce_coupon_per_user commerce_coupon_per_user commerce_coupon_per_user commerce_coupon_per_user commerce_coupon_per_user commerce_coupon_per_user

Nuevamente, puede ver las entradas de archivos duplicados (commerce_coupon_per_user)!

Puede intentar usar git show para cada blob listado y verificar el contenido de cada archivo.

Luego continúe ejecutando ls-tree para ese objeto ls-tree no válido en sus diferentes clones de git para ver si puede rastrear el objeto válido o si todos están rotos.

git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 If you found the valid object containing non-duplicated file entries, save it into the file and re-create by using `git mktree` and `git replace`, e.g. remote$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 > working_tree.txt $ cat working_tree.txt | git mktree NEWTREEbb81a5af7e9203f36c3201f2736fca77ab7c8f29 $ git replace bb81a5af7e9203f36c3201f2736fca77ab7c8f29 NEWTREE4b825dc642cb6eb9a060e54bf8d69288fbee4904

Si esto no ayuda, puedes deshacer el cambio haciendo lo siguiente:

$ git replace -d NEWTREE4b825dc642cb6eb9a060e54bf8d69288fbee4904

Método 3.

Cuando sepa qué entrada de archivo / dir está duplicada, puede intentar eliminar ese archivo y volver a crearlo más adelante. Por ejemplo:

$ find . -name commerce_coupon_per_user # Find the duplicate entry. $ git rm --cached `find . -name commerce_coupon_per_user` # Add -r for the dir. $ git commit -m''Removing invalid git entry for now.'' -a $ git gc --aggressive --prune # Deletes loose objects! Please do the backup before just in case.

Lee mas:

Método 4.

Compruebe su compromiso para las entradas no válidas.

Veamos nuestro árbol de nuevo.

$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 --full-tree -rt -l 160000 commit def08273a99cc8d965a20a8946f02f8b247eaa66 commerce_coupon_per_user 100644 blob 89a5293b512e28ffbaac1d66dfa1428d5ae65ce0 270 commerce_coupon_per_user .... $ git show def08273a99cc8d965a20a8946f02f8b247eaa66 fatal: bad object def08273a99cc8d965a20a8946f02f8b247eaa66 $ git cat-file commit def08273a99cc8d965a20a8946f02f8b247eaa66 fatal: git cat-file def08273a99cc8d965a20a8946f02f8b247eaa66: bad file

Parece que la confirmación anterior no es válida, permite escanear nuestro registro de git para esta confirmación utilizando uno de los siguientes comandos para ver qué está pasando:

$ git log -C3 --patch | less +/def08273a99cc8d965a20a8946f02f8b247eaa66 $ git log -C3 --patch | grep -C10 def08273a99cc8d965a20a8946f02f8b247eaa66 commit 505446e02c68fe306aec5b0dc2ccb75b274c75a9 Date: Thu Jul 3 16:06:25 2014 +0100 Added dir. new file mode 160000 index 0000000..def0827 --- /dev/null +++ b/sandbox/commerce_coupon_per_user @@ -0,0 +1 @@ +Subproject commit def08273a99cc8d965a20a8946f02f8b247eaa66

En este caso particular, nuestro compromiso apunta al objeto defectuoso, porque se cometió como parte del subproyecto git que ya no existe (verifique el git submodule status ).

Puede excluir ese objeto no válido del ls-tree y volver a crear el árbol sin este objeto defectuoso, por ejemplo:

$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 | grep -v def08273a99cc8d965a20a8946f02f8b247eaa66 | git mktree b964946faf34468cb2ee8e2f24794ae1da1ebe20 $ git replace bb81a5af7e9203f36c3201f2736fca77ab7c8f29 b964946faf34468cb2ee8e2f24794ae1da1ebe20 $ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Re-test. $ git fsck -full

Nota: el objeto anterior aún debe lanzar las entradas de archivos duplicados, pero si ahora tiene duplicados en el nuevo árbol, entonces debe eliminar más elementos de ese árbol. Asi que:

$ git replace # List replace objects. bb81a5af7e9203f36c3201f2736fca77ab7c8f29 $ git replace -d bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Remove previously replaced object.

Ahora tratemos de eliminar todas las confirmaciones y blobs de ese árbol, y reemplazar de nuevo es:

$ git ls-tree bb81a5af7e9203f36c3201f2736fca77ab7c8f29 | grep -ve commit -e blob | git mktree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 $ git replace bb81a5af7e9203f36c3201f2736fca77ab7c8f29 4b825dc642cb6eb9a060e54bf8d69288fbee4904

Ahora tienes un árbol vacío para esa entrada inválida.

$ git status # Check if everything is fine. $ git show 4b825dc642cb6eb9a060e54bf8d69288fbee4904 # Re-check $ git ls-tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 --full-tree # Re-check

Si tienes algunos cambios extraños para la etapa, restablece tu repositorio de la siguiente manera:

$ git reset HEAD --hard

Si tienes el siguiente error:

HEAD is now at 5a4ed8e Some message at bb81a5af7e9203f36c3201f2736fca77ab7c8f29

Realice la rebase y elimine ese compromiso (cambiando pick to edit ):

$ git rebase -i $ git commit -m''Fixed invalid commit.'' -a rebase in progress; onto 691f725 You are currently editing a commit while rebasing branch ''dev'' on ''691f725''. $ git rebase --continue $ git reset --hard $ git reset HEAD --hard $ git reset origin/master --hard

Método 5.

Intente eliminar y aplastar las confirmaciones no válidas que contienen objetos no válidos.

$ git rebase -i HEAD~100 # 100 commits behind HEAD, increase if required.

Lea más: Git Tools - Reescribiendo la historia y ¿Cómo me rebase al omitir un compromiso en particular?

Método 6.

Identificación de los objetos git no válidos mediante los siguientes métodos para la eliminación manual:

  • para objetos no comprimidos (* por favor, elimine los dos primeros caracteres, ya que git lo usa para el nombre del directorio):

    $ find . -name 81a5af7e9203f36c3201f2736fca77ab7c8f29

  • para objetos comprimidos

    $ find . -name /*.idx -exec cat {} /; | git show-index | grep bb81a5af7e9203f36c3201f2736fca77ab7c8f29 # Then you need to find the file manually. $ git unpack-objects $FILE # Expand the particular file. $ git unpack-objects < .git/objects/pack/pack-*.pack # Expand all.

Consulte: ¿Cómo desempaquetar todos los objetos de un repositorio git?

Relacionado:


Nota: Git 2.1 agregará dos opciones para git replace que pueden ser útiles al modificar una entrada dañada en un repositorio de git:

Editar el contenido de un objeto de forma interactiva. El contenido existente para <object> está bastante impreso en un archivo temporal, se lanza un editor en el archivo y el resultado se analiza para crear un nuevo objeto del mismo tipo que <object> .
Luego se crea una referencia de reemplazo para reemplazar <object> con el objeto recién creado.
Consulte git-var para obtener detalles sobre cómo se elegirá el editor.

Y cometer 2deda62 por Jeff King ( peff ) :

Reemplazar: agregar un modo --raw para --editar

Uno de los propósitos de " git replace --edit " es ayudar a un usuario a reparar objetos mal formados o dañados.
Por lo general, imprimimos árboles con " ls-tree ", que es mucho más fácil de trabajar que los datos binarios en bruto.

Sin embargo, algunas formas de corrupción rompen el árbol-caminante, en cuyo caso falla nuestra impresión bonita, haciendo que " --edit " sea inútil para el usuario.

Este parche introduce una opción " --raw ", que le permite editar los datos binarios en estos casos.

Sabiendo cómo se usa Jeff para depurar Git (como en este caso ), no me sorprende mucho ver esta opción.