2012-09-18 15 views
13

Questa è una domanda noob ma sono sotto la pistola per risolvere questo problema. Ho ereditato uno strano problema con un sottoalbero git che appare per corruzione repo.Errore "Fatal: bad object" utilizzando git subtree push

Ecco lo scenario: una sottostruttura di un git-based progetto A è utilizzato in progetto B. Parte dell'uso script deploy spinge la sottostruttura fuori di proiettare repo di B:

git sottostruttura spinta -P sub/percorso/nome --squash [email protected]: MyCo/project_b.git projectb_branch

inizia spingendo i commit e non riesce con

"fatal: bad object {sha}" 

ho cercato per il CSA in git log del repo fonte . Esso si presenta in un commit:

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

Il bersaglio repo (project_b) ha effettivamente un commit con quella SHA ma il repository sorgente non lo fa. Ho attraversato lo script della sottostruttura della shell e posso vedere che non funziona quando cerca di cercare quell'oggetto con git log (nella funzione toptree_for_commit che chiama git log -l --pretty = format: '% T' {sha}).

A questo punto sono sopra la mia testa ma desideroso di provare a trovare una soluzione. Ho studiato questo per quanto riguarda le mie conoscenze limitate, quindi accolgo con favore suggerimenti, trucchi o RTFM che possano avvicinarmi un po 'a una soluzione.

i miei sinceri ringraziamenti!

+0

Il tuo 'git reflog' locale contiene quel' {sha} '? – VonC

+0

no. Sfortunatamente no. –

risposta

3

L'ho capito; Ho trovato il riferimento dello sha errante nelle informazioni di commit.

Il modo più semplice per risolvere questo problema è quello di:

  • smettere di usare la scissione sottostruttura che era stato creato,
  • spostare il contenuto in una sottodirectory diversa e poi
  • resplit la sottostruttura.

Tipo di errore, ma molto meno incline all'errore che il backup si impegna a eseguire il commit problematico e quindi a riapplicarlo (suggerito in risposta a una domanda simile).

Non bello, ma ha fatto il lavoro.

+0

Feedback interessante. +1 – VonC

20

Ho appena incontrato questo problema ed è stato in grado di risolvere da:

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

non potrebbe aiutare per tutti, ma mi ha salvato dal dover incidere sulle strutture di pronti contro termine.

+3

Giusto per chiarire, per i noob come me $ url, $ prefisso e $ branch devono essere compilati con il proprio URL, prefisso e ramo propri. – lnhubbell

3

mi sono imbattuto problema simile: git subtree push ... utilizzato per lavorare al computer, dove ho fatto git subtree add ..., ma non avrebbe funzionato sul secondo computer:

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

Fix è stato quello di tirare i cambiamenti dal repository prima (anche se non ci sono stati cambiamenti):

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

e anche se non tirare nulla, spinta ha funzionato bene, allora:

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

git pull ha funzionato per me. Se il tuo ramo attuale non è remoto, crea un ramo remoto usando

`git push -u origin <branchname>`