2012-02-21 4 views
68

Sto cercando di spingere un nuovo ramo locale a remoto product-0.2 dove c'è già un tag con lo stesso nome (ma il ramo in sé non esiste)git push sezione locale con lo stesso nome di tag remoto

git push -v --tags --set-upstream origin product-0.2:product-0.2 
Pushing to https://****@github.com/mycompany/product.git 
error: src refspec product-0.2 matches more than one. 
error: failed to push some refs to 'https://****@github.com/mycompany/product.git' 

Stessa cosa con:

git push origin product-0.2:/refs/heads/product-0.2 

Anche se il contrario funziona, ad esempio, creare un ramo product-0.1, impegnarsi su di esso quindi applicare un tag product-0.1.

Alcune persone aggirano questo problema rimuovendo il tag in conflitto localmente, quindi spingono il ramo, quindi recuperano il tag remoto, ma sembra macchinoso e soggetto a errori.

Come posso creare il mio ramo con il minimo sforzo?

Grazie per l'input

+1

Provate 'refs/heads/product-0.2: refs/heads/product-0.2', cioè senza la barra iniziale, e dando anche il refspec completo sul lato locale. – knittl

+0

Si può provare git push origin-product 0.2: product-0.2 – vpatil

risposta

103

Il seguente comando dovrebbe funzionare.

git push origin refs/heads/product-0.2:refs/heads/product-0.2 
+9

Risposta accettata, questo è il modo di disambiguare. Tuttavia, è molto più semplice non avere tag e rami con lo stesso nome in primo luogo. Alcuni strumenti (ad esempio SourceTree) si imbatteranno su di esso e resterai sui tuoi dispositivi, con la riga di comando come unica soluzione. Grazie ragazzi! – youri

+0

Det sa sa lite :) – ralphtheninja

+1

+1.Una cosa simile funziona quando è necessario disambiguare i nomi remoti: 'refs/remotes/remote_name/remote_branch' – Kelvin

13

Modificare i nomi. Sia che tu lo faccia in locale o in remoto, basta cambiare i nomi. Un tag e un ramo sono fondamentalmente la stessa cosa in git: rappresentano un puntatore a un commit. La differenza è che un puntatore di diramazione avanza mentre esegui commit, mentre un tag rimane statico. Tuttavia, è possibile eseguire un git checkout su un ramo o un tag. Perché combatteresti con tutti questi nomi raddoppiati? Cambiali.

+0

Avrebbe dovuto/avrebbe potuto chiamare il tag 'product-0.2.0' con l'ultima cifra per il 'livello patch', ma ancora, avevamo la convenzione di denominazione sul posto e non abbiamo avuto problemi in passato quando il ramo era creato prima del tag. – youri

+0

Se la squadra ha già iniziato a utilizzare il ramo, non sarebbe armfull rinominarlo? – svassr

+0

Cambia il nome dell'entità che non hai ancora spinto. – TheBuzzSaw

1

questo non è riuscito:

git push $origin $branch:$branch 

Anche se questo ha funzionato per me:

git checkout $branch 
git push $origin HEAD:$branch 
16

Verificare quali tag sono associati con la vostra filiale:

git tag 

Nel mio caso, ho avuto un tag con lo stesso nome del ramo. L'eliminazione ha funzionato:

git tag -d [tag-name] 
3

stavo cercando di spingere per un repository canonica questa mattina e ottenuto il seguente errore:

$ git push origin master 
error: src refspec master matches more than one. 
error: failed to push some refs to 'ssh://[email protected]/srv/git/repo' 

Questo è accaduto perché avevo accidentalmente creato un tag maestro a livello locale:

$ git tag 
master 
tag1 
tag2 
tag3 
tag4 

Una volta che ho cancellato questo tag a livello locale:

git tag -d master 

Sono stato in grado di spingere di nuovo.

+0

Buona spiegazione. È necessario eliminare il tag locale. Grazie! –

Problemi correlati