Il mio repository Git si trova nella directory principale sbagliata. Posso spostarlo? (../ invece di ./)


118

In qualche modo, quando ho modificato il git initmio ultimo progetto un mese fa circa, ho eseguito il comando nella directory una directory più in alto rispetto alla radice del mio progetto.

Quindi il mio repository è nella ./projectdirectory e non nella ./project/my-new-projectdirectory. Non so come non mi sono reso conto del problema prima, ma non ho mai cercato la directory .git fino ad ora.

C'è un modo, senza uccidere il mio progetto, per spostare il repository nella directory corretta e poi dire a git qual è la nuova base del progetto? Il solo spostamento della directory non funziona. Git pensa che tutti i file siano stati eliminati.

Risposte:


19

Probabilmente la cosa più semplice, a meno che tu non abbia già creato della cronologia che desideri salvare, sarebbe semplicemente eliminare la .gitsottodirectory e ripetere l'init nella directory corretta.

Se hai usato git per risolvere il problema, qualsiasi soluzione lascerebbe necessariamente dietro di sé molte voci di cronologia "spostato qui" che non sono effettivamente cambiate, ma risolverai un errore al momento della creazione. Meglio solo crearlo bene.


2
Capisco cosa stai dicendo, ma qualsiasi azione in-git che fai per correggere questo finirà per lasciare un mucchio di storie "spostato qui" che non sono effettivamente cambiate, ma risolvi un errore al momento della creazione. Meglio solo crearlo bene.
TED

8
Questo rompe un sacco di cose. stackoverflow.com/a/3247756/825364 è un modo molto migliore per farlo.
Steve Tauber

2
Bene, il salvataggio della cronologia è ciò per cui viene utilizzato Git. Forse dovremmo semplicemente eliminare la sottodirectory .git e disinstallare Git dal nostro sistema? L'uso di un server ftp al posto di vcs è probabilmente la cosa più semplice dopo tutto!
Gherman

2
la risposta di seguito è un approccio molto migliore poiché conserva tutta la cronologia
BigMikeW

2
Quindi per me, l'ho fatto e ho subito capito il mio errore. senza dover preoccuparsi di modifiche, questo è il modo più semplice per tornare a una lavagna pulita.
Mike

261

Ho avuto il problema opposto: ho dovuto spostare la radice git nella directory principale (da project / src a project) Con mia estrema sorpresa, quanto segue ha funzionato !!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git ha rilevato abilmente che tutti i nuovi file sono stati rinominati versioni di quelli vecchi e nessuna cronologia è stata persa

Puoi provare qualcosa di simile ... sposta la cartella .git e aggiungi di nuovo i file prima di eseguire il commit


8
Ha funzionato perfettamente per me. Ho anche spostato altri file di configurazione .git * dalla directory come .gitigore
Relequestual

7
Mio caro signore, sei un salvatore della vita. Questa cosa FUNZIONA davvero. Grazie.
Radu Murzea

1
Inoltre, ho git rm'di file dalla loro vecchia posizione, quindi git status(correttamente) ho finito per segnalare una serie di operazioni di ridenominazione. Più lavoro con git, più mi piace.
SS

7
@Mike questo dovrebbe essere contrassegnato come risposta accettata. È una soluzione preferita al reinserimento perché non perdi la storia. Se non mi credi, il conteggio dei voti positivi parla da solo.
Joseph Spens

3
Grazie! Per me ha funzionato, ma ho dovuto fare ancora un paio di cose: 1. Prima di eseguire il commit, ho aggiornato .gitignoreed eseguito git add -Anella cartella principale; dopo questo, git ha mostrato correttamente tutti i file come renamedinvece di deleted. 2. Dato che utilizzo i sottomoduli, ho dovuto spostarmi .gitmodulesnella nuova root e aggiornare il percorso del sottomodulo nei vari file di configurazione di git. Per trovare quali file modificare ho eseguitogrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari

43

Questo ha funzionato per me e ha mantenuto intatta tutta la mia storia. Dalla cartella principale errata (il genitore in cui hai accidentalmente inizializzato il repository):

Sposta la cartella:

mv .git thecorrectfolder/

Reinizializza il repository git:

cd thecorrectfolder/
git init

Aggiungere nuovamente tutti i file, eseguire il commit e il push:

git add .
git commit -am 'fixing things'
git push origin master

Fatto! Prendi una birra.

Quando esegui il commit del repository git dopo la reinizializzazione, otterrai un mucchio di output simile a questo:

rename {ethanode/coffee => coffee}/app.coffee (100%)

In altre parole, tutti i tuoi riferimenti dalla cartella principale e vengono rinominati per utilizzare la cartella corretta.


Grazie! Questo metodo era esattamente ciò di cui avevo bisogno!
Giel Berkers

Questo ha funzionato per me, ma era leggermente brutto. Per quanto riguarda git, non ho "spostato" nulla, ho solo eliminato centinaia di file e poi aggiunto centinaia di altri file identici.
bjmc

6
git init non è richiesto e la parte rimanente è la stessa della mia risposta che è stata inviata anni prima della tua: stackoverflow.com/a/3247756/391753
Abhishek Anand

35

git filter-branchti consente di riscrivere la storia in questo modo. La git filter-branchpagina man ha anche il tuo caso come esempio :

Per riscrivere il repository in modo che appaia come se foodir / fosse stata la radice del progetto e scartare tutta la cronologia:

git filter-branch --subdirectory-filter foodir -- --all

Probabilmente vuoi git cloneil repository in una nuova sottodirectory prima (o dopo?) L' git filter-branchesecuzione. (La clonazione prima del ramo del filtro e l'esecuzione del ramo del filtro sul nuovo clone avrebbe il vantaggio di lasciare la .git/directory originale in posizione come backup nel caso in cui qualcosa vada storto.)


1
Questo non "scarta tutta la cronologia " (suggerendo che il .gitrepository rimane al livello superiore mentre le sottodirectory vengono "pensate come root") - questo eliminerà letteralmente tutti gli altri file nel repository e sposterà tutti i subdirectory/*file nella cartella principale .
Louis Maddox,

Ottima risposta, ma tieni presente che se c'è un file .gitignore (se tracciato), verrà perso con questa operazione. Inoltre, dovrai eseguire una git push --forceper aggiornare il repository upstream dopo questo.
waldyrious

12

Git può ricordare i file con i loro hash,

Basta spostarti .gitnella directory principale e dire gitdi ricordare tutte le modifiche ai file con l' --allopzione.

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."

3

Utilizzare git-mvper spostare i file "su" nella posizione corretta, quindi git-rmnella directory "mio-nuovo-progetto".


È il contrario. Non voglio spostare tutti i miei file nella directory in cui si trova git (ci sono un sacco di altre cose lì ... sarebbe fastidioso) e poi spostare git verso l'alto. Voglio spostare il repository fino alla directory principale del mio progetto.
Mike

2

Sono venuto qui cercando un modo per spostare il mio repository ovunque .

Casomai non fossi l'unico, ecco cosa ho fatto alla fine:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F Ho "git clone --mirror" da copia nuda del mio repository e in seguito ho detto di non essere più nudo, quindi i file sono stati visualizzati in quella nuova cartella. (Quindi ha controllato se i file e il registro erano apparsi o meno.) Ho mantenuto il vecchio repository per un po ', per ogni evenienza ...

In questo modo sono stato in grado di spostare il mio repo senza perdere la cronologia.

I migliori saluti, Dinah


Correggimi se sbaglio, ma sembra che avresti potuto ottenerlo spostando semplicemente la directory del repository nella posizione designata usando nient'altro che strumenti del filesystem nudo, come mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee

2

Avendo appena affrontato lo stesso problema, la mia soluzione finale è stata:

  1. Sposta la cartella .git dove doveva essere.
  2. Cambia directory nella cartella in cui ho appena spostato .git
  3. Reimposta il contenuto della cartella a quello che git pensa che dovrebbe essere: git reset --hard HEAD
  4. Verifica che i contenuti corrispondano a quello che dovrebbero essere con kdiff3 o un altro strumento di confronto
  5. Elimina i file ora senza versione nella vecchia posizione.

Ha funzionato come per magia senza alcun impatto sulla storia. - NB Se hai apportato delle modifiche assicurati di eseguirne il commit prima di spostare la directory .git.


-3

Ci sono due modi qui:

  1. cd TheWrongDirectory rm -rf .git

  2. ELIMINA semplicemente la cartella .git e cd nella directory giusta.

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.