GIT: Checkout a una cartella specifica

Voglio usare qualcosa di simile a:

git checkout -- / 

ma voglio controllare il file in una cartella che scelgo, piuttosto che sovrascrivere il locale /.

Qualche idea?

Come per fare un “git export” (come “svn export”)?

Puoi usare git checkout-index per questo, questo è un comando di basso livello, se vuoi esportare tutto, puoi usare -a ,

 git checkout-index -a -f --prefix=/destination/path/ 

Per citare le pagine man:

L’ultimo “/” [sul prefisso] è importante. Il nome esportato è letteralmente solo preceduto dalla stringa specificata.

Se vuoi esportare una determinata directory, ci sono alcuni trucchi coinvolti. Il comando prende solo i file, non le directory. Per applicarlo alle directory, usa il comando ‘trova’ e invia l’output a git.

 find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin 

Anche dalle pagine man:

L’intuizione non è l’objective qui. La ripetibilità è

Un’altra soluzione che è un po ‘più pulita – basta specificare un albero di lavoro diverso.

Per controllare tutto dal tuo HEAD (non indice) a una specifica directory esterna:

 git --work-tree=/path/to/outputdir checkout HEAD -- . 

Per eseguire il checkout di una sottodirectory o di un file dal HEAD in una directory specifica:

 git --work-tree=/path/to/outputdir checkout HEAD -- subdirname 

Per un singolo file:

 git show HEAD:abspath/to/file > file.copy 

Le soluzioni di cui sopra non hanno funzionato per me perché avevo bisogno di controllare una versione specifica tag dell’albero. A proposito, è così che si intende l’ cvs export . git checkout-index non accetta l’argomento tag, in quanto controlla i file dall’indice. git checkout cambierebbe l’indice indipendentemente dall’albero di lavoro, quindi avrei bisogno di resettare l’albero originale. La soluzione che ha funzionato per me era clonare il repository. Il clone condiviso è abbastanza veloce e non richiede molto spazio extra. La directory .git può essere rimossa se lo si desidera.

 git clone --shared --no-checkout   cd  git checkout  rm -rf .git 

Le versioni più recenti di git dovrebbero supportare git clone --branch per verificare automaticamente il tag specificato:

 git clone --shared --branch    rm -rf /.git 

Se stai lavorando sotto la tua funzione e non vuoi eseguire il checkout per diventare master, puoi eseguire:

 git worktree add ../myrepo_master master 

../myrepo_master directory ../myrepo_master con commit delle diramazioni master , dove è ansible continuare a lavorare

La risposta di Adrian ha gettato “fatale: questa operazione deve essere eseguita su un albero di lavoro”. Quello che segue è quello che ha funzionato per noi.

 git worktree add  --no-checkout --detach cd  git checkout  --  

Gli appunti:

  • --no-checkout Non eseguire alcun checkout nel nuovo worktree.
  • --detach Non creare un nuovo ramo per il nuovo albero di lavoro.
  • funziona con qualsiasi ref, ad esempio funziona con HEAD~1 .
  • Pulizia con git worktree prune .

Ho definito un alias git per ottenere solo questo (prima ho trovato questa domanda).

È una breve funzione di bash che salva il percorso corrente, passa al repository git, fa un checkout e torna da dove è iniziato.

git checkto per sviluppare ~ / my_project_git

Questo, ad esempio, controllerebbe il ramo di sviluppo nella directory “~ / my_project_git”.

Questo è il codice alias in ~/.gitconfig :

 [alias] checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \ exit 1; [ -z \"$2\" ] && echo \"Need to specify target\ dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \ git checkout \"$1\"; cd \"$cDir\"; };f" 

Sto usando questo alias per controllare un ramo in una directory temporanea:

 [alias] cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory 

Uso:

 git cot mybranch 

Si viene quindi rilasciati in una nuova shell nella directory temporanea in cui è ansible lavorare sul ramo. Puoi anche usare i comandi git in questa directory.

Al termine, elimina la directory ed esegui:

 git worktree prune 

Anche questo viene fatto automaticamente nell’alias, prima di aggiungere un nuovo albero di lavoro.