2013-03-24 8 views
25

C'è un modo a un comando per ottenere un mirror aggiornato di un repository remoto? Questo èScorciatoia Git da tirare con clone se non ci sono ancora locali?

  • se repo locale non c'è ancora: clone
  • se è lì: tirare

So che potrei scritto questo intorno (ad es if [ -d repo ]; then (cd repo && git pull); else git clone $repourl;fi ), ma ho bisogno di più semplice croce possibile - modo semplice (effettivamente usato per Jenkins-CI, che so farlo per impostazione predefinita, tuttavia ho bisogno di 2 repository per i quali il supporto è limitato).

Git ha scorciatoie simili per altre cose (ad esempio checkout -b e pull stesso), quindi mi chiedo se mi sia sfuggito qualcosa. Grazie!

+0

Avete pensato di scrivere un nuovo alias git per questo scopo? – harpun

+0

Da dove dovrebbe clonare il repository? – Ikke

+0

Perché è necessario accedere al secondo repository? È possibile rimodellare questo in modo che il progetto dipenda da risorse locali distribuite dal secondo progetto? – Steinar

risposta

4

sa da dove clonare perché il repository locale ha un remoto registrato nella sua configurazione locale. Funziona da un albero funzionante.

Ma git clone no, deve avere un URL remoto esplicito passato in parametro per clonare. Funziona all'esterno dell'albero di lavoro.

La ragione principale di una tale scorciatoia per non esiste è che:

  • si git init raramente per un dato pronti contro termine: si tratta di un comando di una volta nella vita di pronti contro termine.
    Inoltre potrebbe essere necessario il comando aggiuntivo per essere completato: se si hamoduli, ad esempio, sarà necessario aggiungere un git submodule update --init.
  • si git pull spesso all'interno di un determinato repo. git pull è di per sé una scorciatoia (per git fetch + git merge). Anche git pull --rebase è un'altra scorciatoia per git fetch + git rebase.

Considerando il numero di volte che si utilizza git init, tale scelta rapida non è una priorità elevata.

Quindi uno script rimane il modo più sicuro per definire ciò che ti serve.

+0

Ok, ma pensavo di passare "l'url" a tale comando .. E.g. git-clone-or-pull $ URL $ branch. Grazie comunque. – inger

+0

@inger Sono d'accordo: dovresti passarlo come parametro allo script/alias che definiresti. – VonC

+0

sì, ero preparato a farlo. Grazie. – inger

41

Non c'è, dato che i comandi che operano su repository esistenti presuppongono tutti che vengano eseguiti all'interno di un determinato repository.

Detto questo, se si esegue una shell, è possibile utilizzare semplicemente i built-in della shell. Per esempio, ecco bash:

if cd repo; then git pull; else git clone https://server/repo repo; fi 

Questo controlla se repo è una directory valida, e se è così, fa un pull all'interno di esso; altrimenti fa un clone per creare la directory.

+1

Una risposta più precisa della mia per quanto riguarda la parte di script: +1 – VonC

+0

Grazie, quindi il sospetto aveva ragione, bisogno di uno script (es. Dipendenza esterna a git). Tuttavia non sono sicuro del ragionamento "dato che i comandi che operano su repository esistenti presuppongono tutti di essere eseguiti all'interno di un determinato repository": git-clone non lo assume, ad esempio .. È facile immaginare un passare '- pull-if-there' - ovviamente questa è la prima cosa che ho controllato, per non avere successo. – inger

+0

@VonC, ad eccezione del fatto che la domanda non riguardava la parte di script. A proposito, sembra errata, dovrebbe essere --git-dir = repo/.git – inger

23

quello più pulito-liner potrebbe essere

git -C repo pull || git clone https://server/repo repo 
+0

Nice, ma non funziona con git 1.7.10.4 – keyvan

+0

su Git versione <1.8.5 (Q4 2013), è l'opzione 'Sconosciuta: -C' –

0

git -C repo pull funziona solo su git 1.8.5 o superiore.Per raggiungere questo obiettivo il versioni precedenti, provare:

remote_repo=https://server/repo 
local_repo=repo 

if [ -d $local_repo/.git ]; then pushd $local_repo; git pull; popd; else git clone $remote_repo; fi