Come posso clonare in una directory non vuota?

Ho una directory A con file corrispondenti alla directory B. Directory A potrebbe avere altri file necessari. Directory B è un repository git.

Voglio clonare la directory B nella directory A, ma git-clone non mi consentirà poiché la directory non è vuota.

Speravo che sarebbe solo clonare .git e dal momento che tutti i file corrispondono potrei andare da lì?

Non riesco a clonare in una directory vuota perché ho file nella directory A che non sono nella directory B e voglio mantenerli.

Copiare .git non è un’opzione, dal momento che voglio che gli spilli / spinga con e non voglio impostarli manualmente.

C’è un modo per fare questo?

Aggiornamento: Penso che funzioni, qualcuno può vedere qualche problema? ->

cd a git clone --no-hardlinks --no-checkout ../b a.tmp mv a.tmp/.git . rm -rf a.tmp git unstage # apparently git thinks all the files are deleted if you don't do this 

Questo ha funzionato per me:

 git init git remote add origin PATH/TO/REPO git fetch git reset origin/master # this is required if files in the non-empty directory are in the repo git checkout -t origin/master 

NOTA: -t imposterà il ramo upstream per te, se questo è ciò che vuoi, e di solito lo è.

Nella seguente shell comandi existing-dir è una directory il cui contenuto corrisponde ai file tracciati nel repository git repo-to-clone .

 # Clone just the repository's .git folder (excluding files as they are already in # `existing-dir`) into an empty temporary directory git clone --no-checkout repo-to-clone existing-dir/existing-dir.tmp # might want --no-hardlinks for cloning local repo # Move the .git folder to the directory with the files. # This makes `existing-dir` a git repo. mv existing-dir/existing-dir.tmp/.git existing-dir/ # Delete the temporary directory rmdir existing-dir/existing-dir.tmp cd existing-dir # git thinks all files are deleted, this reverts the state of the repo to HEAD. # WARNING: any local changes to the files will be lost. git reset --hard HEAD 

Una leggera modifica ad una delle risposte che ha funzionato per me:

 git init git remote add origin PATH/TO/REPO git pull origin master 

iniziare subito a lavorare sul ramo master.

Ecco cosa ho fatto quando ho avuto lo stesso problema (almeno penso che sia lo stesso problema). Sono entrato nella directory A e ho eseguito git init .

Dato che non volevo che i file nella directory A fossero seguiti da git, ho modificato .gitignore e aggiunto i file esistenti. Dopo di ciò ho eseguito git remote add origin '' && git pull origin master e voíla, B è “clonato” in A senza un singolo singhiozzo.

 git init git remote add origin PATH/TO/REPO git fetch git checkout -t origin/master -f 

Modificato dalla risposta di @ cmcginty – senza -f non ha funzionato per me

Questo ha funzionato per me:

 cd existing_folder git init git remote add origin path_to_your_repo.git git add . git commit git push -u origin master 

Un’altra semplice ricetta sembra funzionare bene per me:

 git clone --bare $URL .git git config core.bare false 

Il mio caso d’uso principale per il check-out in una directory con file esistenti è controllare i miei dotfile Unix con Git. Su un nuovo account, la home directory avrà già alcuni file, forse anche quelli che voglio ottenere da Git.

Forse ho frainteso la tua domanda, ma non sarebbe più semplice copiare / spostare i file da A a git repo B e aggiungere quelli necessari con git add ?

AGGIORNAMENTO: dal git doc:

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

SOURCE: http://git-scm.com/docs/git-clone

Stavo cercando qualcosa di simile, ed ecco cosa mi è venuto in mente:

La mia situazione è quella in cui ho un albero web attivo e stavo cercando di creare un repository remoto per questo senza spostare nessuno dei file nell’albero web corrente. Ecco cosa ho fatto:

  1. Vai alla struttura Web ed esegui git init
  2. Vai nella posizione prevista del repository ed esegui: git clone --bare /path/to/web/repo
  3. Modifica il file di configurazione nel mio repository remoto e rimuovi la sezione [remote "origin"] .
  4. Aggiungi una sezione di [remote "origin"] a .git / config nell’albero web che punta al nuovo repository remoto.

questo è lavoro per me, ma dovresti unire file di repository remoti ai file locali:

 git init git remote add origin url-to-git git branch --set-upstream-to=origin/master master git fetch git status 

L’ho usato pochi istanti fa, richiede i comandi meno potenzialmente distruttivi:

 cd existing-dir git clone --bare repo-to-clone .git git config --unset core.bare git reset 

E voilá!

Mi è piaciuta la risposta di Dale e ho anche aggiunto

 git clone --depth 2 --no-checkout repo-to-clone existing-dir/existing-dir.tmp git branch dev_new214 git checkout dev_new214 git add . git commit git checkout dev git merge dev_new214 

La profondità ridotta evitava molti commit extra precoci. Il nuovo ramo ci ha regalato una buona cronologia visuale sul fatto che ci fosse del nuovo codice da questo server che è stato inserito. Questa è la branca dell’uso perfetto secondo me. I miei ringraziamenti alla grande intuizione di tutte le persone che hanno pubblicato qui.

Ecco cosa sto facendo:

 git clone repo /tmp/folder cp -rf /tmp/folder/.git /dest/folder/ cd /dest/folder git checkout -f master