Come spostare un repository git in un'altra directory e rendere quella directory un repository git?


101

Ho una directory gitrepo1 . Questa directory è un repository git.

  • Vorrei spostare questo gitrepo1 in un'altra directory newrepo .

  • La directory newrepo dovrebbe essere il nuovo repository git senza perdita di cronologia git e dovrebbe contenere la directory gitrepo1 .

  • La directory gitrepo1 dovrebbe essere solo una directory ora (all'interno di newrepo ), senza alcun .gitindice, cioè NON dovrebbe più essere un repository git indipendente o un sottomodulo.

Come posso fare questo?


9
mv girepo1 newrepo??
ddavison,

Risposte:


109

È molto semplice. A Git non interessa qual è il nome della sua directory. Gli importa solo di cosa c'è dentro. Quindi puoi semplicemente fare:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Nota che la copia è piuttosto costosa se il repository è grande e con una lunga storia. Puoi anche evitarlo facilmente:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Una volta creato newrepo, la destinazione da inserire gitrepo1potrebbe essere ovunque, anche all'interno newrepose lo desideri. Non cambia la procedura, solo il percorso che stai riscrivendo gitrepo1.


6
+1. Probabilmente vale la pena menzionare questo problema che influisce sui repository creati con git versione 1.7.8 o 1.7.9, il che può significare che lo spostamento di un repository git lo rende inutilizzabile (anche se come indicato è facilmente corretto).
AD7six

1
sono su una macchina Windows e utilizzo il prompt dei comandi. non sono riuscito a trovare il comando "cp". il comando "cp" è specifico per un altro sistema operativo?
LP13

1
@ user3862378, cpcome quasi tutti i comandi o le funzioni sono specifici di altri sistemi operativi. In effetti, è specifico per ogni sistema operativo che non è Windows. Prova a chiamare Microsoft e chiedi loro perché non sono POSIX. Comunque, cpsignifica copia. mvsignifica muovere. rmsignifica rimuovere. Puoi trovare gli equivalenti di Windows.
Shahbaz

@ Shahbaz Grazie, la soluzione sopra crea la seguente struttura "newrepo ->. Git" e "newrepo-> tutti gli altri file da gitrepo1" ... non sta mettendo la cartella "gitrepo1" all'interno di "newrepo" .. sono curioso se creare cartelle manualmente in Windows e spostare la cartella ".git" sotto la cartella principale .. funzionerebbe senza influenzare la cronologia?
LP13

2
@ user3862378, non c'è motivo per cui non dovrebbe. .git/contiene tutta la cronologia, che include il tuo ultimo commit. Ovunque lo metti, hai tutta la storia. In effetti, se tutti i file in quella directory sono diversi dal repository originale da cui hai preso .git/, l'unica cosa sarebbe che ti dice che alcuni file sono stati cancellati e altri non tracciati sono presenti. Con a git reset --hard, i file rimossi verranno ripristinati automaticamente! L'unica cosa da notare è che semplicemente copiando .git/non è possibile recuperare le modifiche non salvate.
Shahbaz

4

È un po 'tardi e la domanda ha già una risposta ma, per farlo senza grattacapi:

  1. Controlla qual è il ramo corrente in cui ti trovi nella vecchia cartella git git status, diciamo sviluppo del ramo
  2. Cambia la directory nella nuova cartella git, quindi git cloneil progetto dal repository alla nuova cartella
  3. Controlla il ramo corrente nella tua nuova cartella: git checkout development
  4. Sincronizza la tua nuova cartella con quella precedente, utilizzando rsync, esclusa la cartella .git :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

Allora sei bravo a continuare da dove avevi interrotto


1

È ancora più semplice di così. Ho appena fatto questo (su Windows, ma dovrebbe funzionare su altri sistemi operativi):

  1. Crea nuovo repo .
  2. Spostare gitrepo1 in newrepo .
  3. Sposta .git da gitrepo1 a newrepo (su di un livello).
  4. Effettua il commit delle modifiche (correggi il monitoraggio come richiesto).

Git vede solo che hai aggiunto una directory e rinominato un gruppo di file. Nessun problema.


1

Non sono un esperto, ma copio la cartella .git in una nuova cartella, quindi invoco: git reset --HARD

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.