2012-09-16 21 views

risposta

18

Si può semplicemente clonare il repository in un'altra directory sulla stessa macchina:

git clone /bare/repo/dir.git 

La directory corrente diventerà un clone non nuda del pronti contro termine, e si otterrà un checkout del ramo master automaticamente. Quindi utilizzare i consueti comandi come git pull per aggiornarlo secondo necessità.

Come vantaggio collaterale, questa operazione è molto efficiente: se si specifica una directory locale su git clone, git tenterà di condividere gli oggetti tra questi due repository utilizzando i collegamenti fisici.

+0

Questa operazione funziona per gli aggiornamenti? –

+0

Che tipo di aggiornamenti? Il repository clonato è solo un altro clone, quindi il suo albero di lavoro dovrebbe essere aggiornato usando 'git pull'. Se è necessario che ciò avvenga automaticamente, è possibile organizzare l'hook 'post-receive' del server per eseguire un' git pull' sul clone. – user4815162342

+0

Oh giusto, ovviamente. Stavo pensando in termini di "clone" troppo. –

8

che cercavo per l'approccio "distaccato albero di lavoro" (come si vede here):

git init --bare 

git config core.worktree /somewhere/else/ 
git config core.bare false 

git checkout -f 
+3

Si noti che è necessario eseguire 'core.bare' prima della riga' core.worktree', come indicato nei commenti di quel post del blog (e confermato da me proprio ora). Altrimenti si otterrà l'errore 'fatale: core.bare e core.worktree non hanno senso». – craigpatik

+0

Strano, così ho fatto io: https://gist.github.com/joallard/8871673. Forse il comportamento in Git è cambiato a un certo punto? –

+0

Sembra che sia * vicino * a quello di cui ho bisogno, ma il tuo link è rotto e i comandi sopra riportati non sono spiegati abbastanza da poterli adattare alle mie esigenze. Puoi aggiustare il link e/o spiegare cosa sta succedendo lì? – Wildcard

3

Questo è un riff fuori l'altro 2 risponde ma colma il vuoto per il mio caso d'uso - funziona per aggiornare il repository dall'origine e controllare i rami e qualsiasi operazione git perché si finisce con una normale comp lete git repo.

git clone /path/to/bare/repo /new/path/to/full/repo 
cd /new/path/to/full/repo 
git remote set-url origin [email protected]:swift/swift.git 

Dopo aver eseguito queste 3 righe di codice è possibile quindi git pull e git branch e git checkout some_branch e così via, perché ora avete una normale repo git completo collegato al repo remoto.

+0

tuo l'unico che ha menzionato some_branch, dovresti elaborare. stavo specificatamente cercando di trovare un esempio per il ramo, e questo era caldo su google per il ramo e fa parte di OQ. ... – blamb

1

Questo è come funziona:

$ git init --separate-git-dir /path/to/existing-bare-repository /path/to/workdir 
$ cd /path/to/workdir 
$ git checkout . 

Voilà!

Per informazioni: git init riporterà: Reinitialized existing Git repository in /path/to/existing-bare-repository. Ma sii sicuro. man git-init dice: L'esecuzione di git init in un repository esistente è sicura. Non sovrascriverà le cose che sono già lì.

La magia è che git init da solo non fa apparire i file nella directory di lavoro. Devi eseguire il checkout della directory principale.

6

Un repository nudo è solo la directory .git di una directory di lavoro e una voce nel file di configurazione locale.Quello che ho fatto per convertire un repository nuda in una vera a uno è:

  • Creare una nuova sottodirectory .git e spostare tutti i file dal repository nudo in là
  • Modificare il file .git/config di cambiare bare = true-bare = false
  • Controlla il ramo che vuoi. Questo estrae tutti i file dal repository nella directory di lavoro.

È possibile impostare l'attributo Nascosto sulla directory .git su Windows, ma non sui file all'interno della directory.

+1

Funziona come un fascino. Aiutato a recuperare i repository dall'installazione di bitbucket. – ibai

+0

Owesome ..! questo ha funzionato perfettamente anche per me – Olu