Come far clonare Git nella directory corrente


500

Sto facendo:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git ./

Sto ottenendo:

Fatale: percorso di destinazione "." esiste già e non è una directory vuota.

Conosco il percorso. esiste già. E posso assicurare che la directory È vuota. (Faccio dentro e non vedo niente!)

Cosa mi manca qui per clonare quel progetto nella directory corrente?


16
se lo fai ls -avedi una .gitdirectory?
Davin Tryon,

2
@dtryon - No. Ma vedo un DS_Store qualunque cosa sia. Forse dovrei liberarmene. Grazie per quello -a: s
MEM

@Grazie a quattro la tua rapida risposta. James Maclaughlin che sembra un bellissimo comando per assicurarci di clonare in una directory vuota. :)
MEM

1
Presumo che tu sia su un Mac . Questo aiuta: stackoverflow.com/questions/107701/…
Davin Tryon

Per quello che vale, ogni cartella che navighi su un mac avrà questi piccoli file creati lì. È molto fastidioso sia per gli utenti Windows che utilizzano le stesse condivisioni, sia per qualsiasi sistema (ad es. Git) che ha bisogno di cartelle vuote o esegue azioni a livello di programmazione su ogni file in una cartella.
jsims281,

Risposte:


510

metti semplicemente un punto accanto

git clone git@github.com:user/my-project.git .

Da git help clone:

La clonazione in una directory esistente è consentita solo se la directory è vuota.

Quindi assicurati che la directory sia vuota (controlla con ls -a), altrimenti il ​​comando fallirà.


18
d'accordo, nota che su un Mac, un file .DS_Store creato automaticamente da finder bloccherà il clone. verificare conls -la
ptim

281
No. Questa non è la risposta giusta. Questo sarebbe comunque restituire "fatale: percorso di destinazione '.' esiste già e non è una directory vuota. "
Sid Sarasvati,

16
Funziona con me usando git v1.8.3.2. @SidSarasvati Sei sicuro che la directory corrente sia vuota ?
Wesley Baugh,

3
@SidSarasvati bene per me il directoy non è vuoto, ma non mi interessa, quindi non sono sicuro del perché Git. Perché git non può clonare in una directory non vuota? Sicuramente la funzionalità è solo un download di base.
Nathan Hornby,

3
mkdircrea hardlink .e, ..di default, una nuova directory è tecnicamente "vuota" nei sistemi basati su Unix? Voglio dire, immagino che potresti unlink .e, unlink ..ma ciò potrebbe causare in seguito enormi problemi se dimentichi di ricollegare dopo la clonazione ....
SeldomNeedy,

351

Quanto segue probabilmente non è del tutto equivalente a un clone in tutti i casi, ma ha fatto il trucco per me:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

Nel mio caso, questo produce un .git/configfile che è equivalente a quello che ottengo quando faccio un clone.


40
Inoltre, questo è l'incantesimo che consente al contenuto attuale di rimanere - diciamo se clonate i vostri dotfile nella vostra home directory.
rbellamy,

7
Con questo mi è finalmente permesso clonare in qualsiasi cartella mi piace senza che Git mi tratti come un bambino. Quando ho anche aggiunto un .gitignore temporaneo contenente *(ignora tutto) ho potuto eseguire git checkout masteranche se c'erano già alcuni altri file nella cartella. Quindi tutti i file sottoposti a commit dal repository sono stati clonati (e il .gitignore temporaneo è stato sovrascritto dal proprio .gitignore dal repository). Tutto ha funzionato meravigliosamente. Dovrebbe accadere in questo modo da solo usando git clone -fo qualcosa del genere.
PaulMag,

1
se hai file diversi / nuovi / modificati che verranno sovrascritti (... i file verrebbero sovrascritti dal checkout ... Aborting) usa: git checkout master -f
visualex

3
Non -t \*è necessario in quanto è l'impostazione predefinita.
Palec,

1
git remote set-head origin -apotrebbe tornare utile. Imposta il ramo predefinito di origine ( refs/remotes/origin/HEAD) così come è impostato nel repository remoto. git clonefa questo automaticamente, a differenza git remote add -f.
Palec,

212

@Andrew ha risposto chiaramente qui . Ma così semplice funziona anche se la directory non è vuota:

git init .
git remote add origin <repository-url>
git pull origin master

Sono felice di confermare che <repository-url>può anche essere un repository locale comegit remote add origin /path/to/existing/repo
krubo,

60

Per essere sicuri di poter clonare il repository, vai a qualsiasi directory temporanea e clona il progetto lì:

git clone ssh://user@host.com/home/user/private/repos/project_hub.git

Questo clonerà le tue cose in una project_hubdirectory.

Al termine della clonazione, è possibile spostare questa directory dove si desidera:

mv project_hub /path/to/new/location

Questo è sicuro e non richiede roba magica in giro.


9
Questo creerà una sottodirectory nella directory preesistente /path/to/new/locationche non è certo il punto della domanda.
Pavel Šimerda,

Quindi dovrai spostare manualmente i file nascosti o utilizzare un comando complicato ... e non risponde alla domanda.
Nero



15

Hmm ... specificando il percorso corrente assoluto usando ha $(pwd)funzionato per me.

git clone https://github.com/me/myproject.git $(pwd)

versione git: 2.21.0


13

Se la directory corrente è vuota, allora funzionerà:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo

1
nel mio caso, ha funzionato anche con alcuni file nel '.' directory
OSdave,

2
Si noti che qualsiasi dotfile nelle directory sotto foo, ad es. foo / bar / .foobar non verrà spostato con questo comando. Vedi la risposta di @phatblat
lea

10

Oltre alla risposta di @ StephaneDelcroix, prima di utilizzare:

git clone git@github.com.user/my-project.git .

assicurati che la tua directory corrente sia vuota usando

ls -a

Di fronte a questo problema oggi. Si è scoperto che avevo nascosto le cartelle .git e .gitignore nella directory in cui stavo cercando di clonare il repository. Quando ho rimosso queste cartelle era tutto ok.
Tamara,

Quale sarebbe il comando per svuotare la directory corrente? Penso che sarebbe più utile del semplice controllo :)
pie6k

9

Soluzione: in questo caso, la soluzione utilizzava il dot, quindi:rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

rm -rf .* && può essere omesso se siamo assolutamente sicuri che la directory sia vuota.

I crediti vanno a: @James McLaughlin nei commenti qui sotto.


10
Sembra malvagio, poiché. * Include la directory principale! me: ~ / tmp / tmp / tmp $ ls -d .* . .. me: ~ / tmp / tmp / tmp $
stackunderflow

Questo non aiuta, perché ho delle dipendenze nella directory in cui devo effettuare il checkout.
b01,

18
Non sono sicuro che sia saggio scrivere rm -rf (in qualsiasi forma) in una risposta SO senza qualche segnale di avvertimento VERAMENTE SCary. Qualche utente inesperto potrebbe venire qui alla ricerca del "segno di spunta verde" (di solito la risposta migliore) quindi copiare e incollare questo comando e poof ... lì va il suo duro lavoro nella directory corrente. A proposito: rm -rf ./.*è "più sicuro" se si rimuovono solo i file nascosti (punto) e le directory nella directory corrente (proprio come @stackunderflow ha affermato prima di me). Ma rm -rfè un comando pericoloso per gli utenti inesperti, quindi fai attenzione! Solo i miei 2 centesimi.
Andrew

funziona sull'1.7.1 L'unica cartella all'interno era .gitdopo git init(lo sapevo)
vladkras,

Non è necessario -rfeliminare i file normali. Ti preghiamo di considerare di eliminare questa risposta o di accettarne almeno un'altra.
Navin,

6

Miglioramento della risposta di @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

Il comando shopt è preso da questa risposta SO e cambia il comportamento del comando 'mv' su Bash per includere dotfile, che dovrai includere la directory .git e qualsiasi altro file nascosto.

Si noti inoltre che questo è garantito per funzionare così com'è solo se la directory corrente (.) È vuota, ma funzionerà fino a quando nessuno dei file nel repository clonato avrà lo stesso nome dei file nella directory corrente. Se non ti interessa cosa c'è nella directory corrente, puoi aggiungere l'opzione -f (force) al comando 'mv'.


6

Ho avuto lo stesso bisogno. Nel mio caso, avevo una cartella Web standard creata da un'installazione del server Web. Ai fini di questa illustrazione, supponiamo che questo sia

/server/webroot

e webroot contiene altri file e cartelle standard. Il mio repository ha solo i file specifici del sito (html, javascript, CFML, ecc.)

Tutto quello che dovevo fare era:

cd /server/webroot

git init

git pull [url to my repo.git]

Devi fare attenzione a eseguire git init nella cartella di destinazione perché in caso contrario NON accadrà una delle due cose:

  1. Il git pull fallirà semplicemente con un messaggio su nessun file git, nel mio caso:

fatale: non un repository git (o una qualsiasi delle directory principali): .git

  1. Se c'è è un qualche file di .git nel percorso genitore per la vostra cartella repo tirato verrà creato in quel genitore che contiene il file .git. Questo mi è successo e ne sono rimasto sorpreso ;-)

Questo NON ha disturbato nessuno dei file "standard" che ho nella mia cartella webroot ma ho dovuto aggiungerli al file .gitignore per impedire l'aggiunta involontaria di essi ai successivi commit.

Questo sembra un modo semplice per "clonare" in una directory non vuota. Se non vuoi che i file .git e .gitignore vengano creati dal pull, cancellali dopo il pull.


5

Ulteriore miglioramento sulla risposta di @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

come una fodera:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master


2
shopt -s dotglob
git clone ssh://user@host.com/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp

3
Fornisci ulteriori informazioni per spiegare perché il codice risolve il problema e cosa fa.
Martin,

"git clone ... tmp" - crea la cartella / tmp nella directory in cui viene eseguito il comando e clona il repository Git. Quindi "mv tmp / *." - sposta tutti i file dalla cartella / tmp nella cartella principale (dove è stato eseguito il comando precedente) e infine "rm -rf tmp" - rimuove la cartella / tmp.
Marinski l'

1

usare (punto) alla fine del comando come di seguito

URL clone git .


Questo non funziona su Mac, causa errori: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz,

Per mac :: Dovresti trovarti nella directory principale e quindi usare il nome della cartella anziché. (Punto) come sotto git clone URL nome floder Assicurati che la tua cartella sia vuota.
Upendra,

0

Ecco cosa ho trovato:

Lo vedo:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

Tra le mie ricerche, mi sono imbattuto in:

https://couchpota.to/forum/viewtopic.php?t=3943

Cerca la voce di Clinton.Hall ... Se provi questo (come ho fatto io), probabilmente otterrai la access deniedrisposta, c'era il mio primo indizio, quindi l'errore iniziale (per me), in realtà stava sfuggendo alla radice sbagliata problema.

Soluzione per questo in Windows: assicurati di eseguire cmdo git elevated, quindi esegui:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

Quanto sopra era il mio problema e semplicemente elevare ha funzionato per me.


0

La soluzione per Windowsè clonare il repository in un'altra cartella e quindi copiare e incollare nella posizione originale o semplicemente copiare la .gitcartella invisibile.


-1

Rimozione con

rm -rf. *

potrebbe metterti nei guai o altri errori.

Se hai / path / to / cartella e desideri rimuovere tutto all'interno, ma non quella cartella, esegui semplicemente:

rm -rf / path / to / cartella / *


-1

Quindi ho risolto lo stesso errore eliminando la cartella nascosta .git nella mia directory principale e quindi aggiungendo un punto al "repository git clone". nella mia cartella root / dist. Questo è nel contesto di un progetto webpack vue-cli. Quindi, quello che dicono tutti gli altri è giusto, di solito significa che hai il git tracking nella cartella che stai cercando di clonare o nella cartella principale o nella radice della cartella in questione!


-1
git clone ssh://user@host.com/home/user/private/repos/project_hub.git $(pwd)

Si noti che ciò comporterà comunque lo stesso errore pubblicato nella domanda (" fatale: il percorso di destinazione 'risolto / percorso / di / pwd' esiste già e non è una directory vuota. ") Se lo si sta facendo in un non vuoto directory.
Gino Mempin,


-2

è utile creare un nuovo file da mkdir filename, quindi eseguendo il comando di git clone xxxxx, funziona sul mio computer


-3

Ho visto questa domanda così tante volte - e voglio solo sottolineare che git pulldalla tua directory farà il trucco.

A meno che non mi manchi qualcosa qui, ha funzionato per me.


5
git pullnon farà nulla se non è stato definito alcun repository, che è una parte critica di ciò che git clonefa.
hackel
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.