2011-09-21 20 views
13

Quando creo un nuovo repository sul mio repository gitolite devo sempre inserire il seguente comando prima di poter iniziare a spingere il codice sul server.git push origine master: refs/heads/master cosa fa questo

git push origin master:refs/heads/master

Che cosa fa?

La mia ipotesi è che ha a che fare con il riferimento di testa non è sicuro. Qualcuno potrebbe spiegarmelo?

risposta

27

Ci sono tre parti di questo comando:

git push 

viene invocato il comando di spinta

origin 

Questa nomi remoti a cui si stanno spingendo. Questo è uno dei telecomandi nominati memorizzati in .git/config (è possibile elencarli con git remote), un URL o il token . che indica il repository corrente.

master:refs/heads/master 

questo è chiamato un "refspec", e si può leggere su di esso nella pagina man per git push. Ma in generale, è composto da due parti, separate da due punti. La prima parte è il nome di un ramo locale e la seconda parte è il nome di un ramo nel repository remoto (in questo caso, origin). Questo particolare refspec potrebbe essere ridotto a master:master.

In generale, è possibile accorciare ulteriormente i refspec. Basta specificare master come refspec equivale a usare lo stesso nome sul telecomando, quindi master è lo stesso di master:master.

+0

Grazie per questa spiegazione. Voglio solo aggiungere un collegamento alla documentazione git su Refspec qui: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec E inoltre aggiungere che questo è uno strumento utile per spingendo un ramo, uno spazio dei nomi o un repository diversi sul ramo di un remoto. Ho trovato questo utile per automatizzare il processo di spinta delle risorse statiche in gh-pages dopo averlo compilato con Jekyll per supportare i plugin lì. – prufrofro

1

Imposta il monitoraggio per voi. È possibile utilizzare la scorciatoia per questo:

git push origin master 

La parte dopo i due punti è il nome del ramo sul repo remoto. Se lo ometti, git pensa che tu voglia lo stesso nome.

Spero che questo aiuti.

2

Il comportamento predefinito di git push, che è presumibilmente quello che viene descritto come "push code al server", è solo per spingere i rami locali che hanno un ramo corrispondente, per nome, sul telecomando a cui si sta spingendo. Quando crei un nuovo repository, non ci sono rami in esso, quindi un semplice git push non invierà nulla. Per prima cosa devi spingere esplicitamente un ramo per nome. Successivamente, il comportamento predefinito funzionerà come previsto.

P.S. In realtà, devi solo git push origin master. Quello che fa è inviare il master locale al repository gitolite come master, dal momento che non hai specificato un nome diverso. Se hai detto git push origin master:foo, il ramo che tu chiami localmente "master" sarebbe conosciuto come "foo" su gitolite.

P.P.S. È possibile cambiare il comportamento di push predefinito tra "nothing", "matching" (predefinito), "trackings"/"upstream" e "current". Vedere le impostazioni per "push.default" su git-config man page.

4

master:refs/heads/master è un refspec.

refspecs sono di forma +<src>:<dst>

Così qui master è l'arbitro sul repo locale che si sta spingendo al refs/heads/master refspec sul telecomando (origine). master è abbreviazione di refs/heads/master in realtà.

In effetti, è sufficiente eseguire git push origin master in base al quale verrà eseguito il push del master sul locale per eseguire il master su remoto. Solo quando si desidera passare a un ref diverso è necessario specificare esplicitamente il riferimento di destinazione.

Anche solo git push ha anche un comportamento predefinito, che probabilmente non sarebbe stato il caso prima del primo invio e creato un ramo (master) sul telecomando. Quindi sembrerebbe che tu abbia bisogno di eseguire il comando che hai menzionato. Fare riferimento al manuale

Problemi correlati