2012-09-18 21 views
13

Esta es una pregunta novato, pero estoy preparado para resolver esto. He heredado un problema extraño con un subárbol de git que aparece como como corrupción de repo.Error "Fatal: objeto malo" usando el subárbol git push

Este es el escenario: un subárbol de un proyecto basado en git A está siendo utilizado en el proyecto B. Parte de la utilización script deploy empuja el subárbol a proyectar cesión temporal de B:

git subárbol empuje -P sub/ruta/nombre --squash [email protected]: MiCo/project_b.git projectb_branch

que empieza a empujar las confirmaciones y falla con

"fatal: bad object {sha}" 

he buscado por el SCS en git log de la fuente de recompra . Se manifiesta en un compromiso:

git-subtree-dir: app/assets/ui 
git-subtree-split: {sha} 

el repositorio de destino (project_b) tiene en realidad una confirmación de que SHA pero el repositorio fuente no. Recorrí el script de shell del subárbol Puedo ver que está fallando cuando intenta buscar ese objeto con el registro de git (en la función toptree_for_commit llamando a git log -l --pretty = formato: '% T' {sha}).

En este punto, estoy muy por encima de mi cabeza, pero estoy ansioso por intentar encontrar una solución. Investigué esto en la medida en que mi limitado conocimiento lo permite, por lo que agradezco cualquier consejo, trucos o RTFM que me acerquen un poco a la solución.

mi sincero agradecimiento!

+0

¿Su 'git reflog' local contiene ese' {sha} '? – VonC

+0

no. Lamentablemente no. –

Respuesta

3

He descubierto esto; Encontré la referencia del sha errante en la información de compromiso.

La forma más fácil de solucionar este problema es:

  • parada usando la división sub-árbol que había sido creado,
  • mover el contenido a un subdirectorio diferente y luego
  • resplit el subárbol.

Tipo de problema, pero mucho menos propenso a errores que retroceder, se compromete con la confirmación problemática y luego se vuelve a aplicar (sugerido en una respuesta a una pregunta algo similar).

No es hermoso, pero hizo su trabajo.

+0

Comentarios interesantes. +1 – VonC

20

Me acabo de encontrar con este tema y fue capaz de resolver por:

git remote add shared $url 
git fetch shared 
git subtree push -P $prefix shared $branch 

Puede que no ayudará para todos, pero me salvó de tener que cortar en las estructuras de pases.

+3

Solo para aclarar, para los noobs como yo $ url, $ prefijo y $ branch deben completarse con su propia URL, prefijo y sucursal. – lnhubbell

3

me encontré problema similar: git subtree push ... utilizado para trabajar en el ordenador, donde hice git subtree add ..., pero no iba a funcionar en el segundo equipo:

$ git subtree push --prefix lib [email protected]:lib/lib.git master 
... 
... 
fatal: bad object {sha} 

Fix era para tirar de los cambios del repositorio primero (incluso aunque no hubo cambios):

git subtree pull --prefix lib [email protected]:lib/lib.git master 

ya pesar de que no tire nada, empujar funcionó bien a continuación:

git subtree push --prefix lib [email protected]:lib/lib.git master 
0

git pull funcionó para mí. Si su sucursal actual no es remota, hágalo una sucursal remota usando

`git push -u origin <branchname>` 
Cuestiones relacionadas