Git'i geçerli dizine klonlama


499

Yapıyorum:

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

Ben alıyorum:

Fatal: hedef yol '.' zaten var ve boş bir dizin değil.

Yolu biliyorum. zaten var. Ve dizinin boş olduğundan emin olabilirim. (İçimde yapıyorum ve hiçbir şey göremiyorum!)

Bu projeyi geçerli dizine klonlamak için burada ne eksik?


16
yaparsanız ls -abir .gitdizin görüyor musunuz?
Davin Tryon

2
@dtryon - Hayır. Ama ne olursa olsun bir DS_Store görüyorum. Belki ondan kurtulmalıyım. Bunun için teşekkürler -a: s
MEM

@ Hızlı yanıtınızı dört teşekkürler. Boş bir dizine kopyaladığımızdan emin olmak için güzel bir komut gibi görünen James Maclaughlin. :)
MEM

1
Sanırım Mac'te olduğunuzu varsayıyorum . Bu yardımcı olur: stackoverflow.com/questions/107701/…
Davin Tryon

Değer için, bir mac'ta göz attığınız herhangi bir klasörde bu küçük dosyalar oluşturulur. Hem aynı paylaşımları kullanan Windows kullanıcıları hem de klasörlerin boş olması gereken veya bir klasördeki her dosya üzerinde programlı olarak eylemler gerçekleştiren herhangi bir sistem (örn. Git) için çok can sıkıcıdır.
jsims281

Yanıtlar:


509

yanına bir nokta koy

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

Gönderen git help clone:

Varolan bir dizine klonlamaya yalnızca dizin boşsa izin verilir.

Bu nedenle dizinin boş olduğundan emin olun (işaretleyin ls -a), aksi takdirde komut başarısız olur.


18
kabul ettiğinde, bir mac'ta otomatik olarak bulucu tarafından oluşturulan bir .DS_Store dosyasının klonu engelleyeceğini unutmayın. ile kontrolls -la
ptim

281
Hayır! Bu doğru cevap değil. Bu yine de "ölümcül: hedef yol '" döndürecektir. zaten var ve boş bir dizin değil. "
Sid Sarasvati

16
Git v1.8.3.2 kullanarak benim için çalışıyor. @SidSarasvati Geçerli dizinin boş olduğundan emin misiniz ?
Wesley Baugh

3
@SidSarasvati benim için iyi müdürlük boş değil, ama umrumda değil bu yüzden Git neden emin değilim. Neden klon boş olmayan bir dizine kopyalanamıyor? Elbette fonksiyonel olarak sadece temel bir indirme.
Nathan Hornby

3
mkdiroluşturur .ve ..varsayılan olarak yeni bir dizin Unix tabanlı sistemlerde teknik olarak "boş" olur mu? Yani, sanırım yapabilirdiniz unlink .ve unlink ..klonlamadan sonra tekrar bağlantı
kurmayı

351

Aşağıdakiler muhtemelen her durumda bir klonla tamamen eşdeğer değildir, ancak benim için hile yaptı:

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

Benim durumumda, bu .git/configbir klon yaparken aldığım dosyaya eşdeğer bir dosya üretir .


40
Dahası, bu mevcut içeriğin kalmasına izin veren büyütmedir - diyelim ki dotfiles dosyalarınızı ana dizininize kopyalayıp kopyalamadığınızı.
rbellamy

7
Bununla nihayet Git bana bir bebek gibi davranmadan sevdiğim klasöre klonlama iznim var. Ayrıca klasörde zaten bazı dosyalar olmasına rağmen *(her şeyi yoksay) içeren geçici bir .gitignore eklediğimde gerçekleştirebilirim git checkout master. Daha sonra depodan kaydedilen tüm dosyalar klonlandı (ve geçici .gitignore, repodaki uygun .gitignore tarafından üzerine yazıldı). Her şey harika çalıştı. Bu şekilde tek başına git clone -fveya bir şey kullanarak gerçekleşmelidir .
PaulMag

1
üzerinde yazılacak farklı / yeni / değiştirilmiş dosyalarınız varsa (... dosyaların
çıkışla

3
-t \*Varsayılan olarak gereksizdir.
Palec

1
git remote set-head origin -akullanışlı olabilir. refs/remotes/origin/HEADUzak depoda ayarlandığı şekilde, kaynağın varsayılan dalını ( ) ayarlar . git clonebunu otomatik olarak yapar git remote add -f.
Palec

212

@Andrew burada açıkça cevap verdi . Ancak, dizin boş olmasa bile bu kadar basit çalışır:

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

Olarak <repository-url>da yerel bir repo olabilir onaylamak için mutluyumgit remote add origin /path/to/existing/repo
krubo

60

Repoyu klonlayabildiğinizden emin olmak için herhangi bir geçici dizine gidin ve projeyi orada klonlayın:

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

Bu, dosyalarınızı bir project_hubdizine kopyalar.

Klonlama bittikten sonra, bu dizini istediğiniz yere taşıyabilirsiniz:

mv project_hub /path/to/new/location

Bu güvenlidir ve etrafında büyülü bir şey gerektirmez.


9
Bu, önceden var olan /path/to/new/locationdizinde kesinlikle sorunun konusu olmayan bir alt dizin oluşturur.
Pavel Šimerda

O zaman gizli dosyaları manuel olarak taşımanız veya karmaşık komut kullanmanız gerekecek ... ve bu soruya cevap vermiyor.
Siyah



15

Hmm ... $(pwd)benim için çalışmış olan mutlak akım yolunu belirttim .

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

git sürümü: 2.21.0


13

Geçerli dizin boşsa, bu işe yarayacaktır:

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

1
benim durumumda, '.' içindeki bazı dosyalarla bile çalıştı. dizin
OSdave

2
Foo altındaki dizinlerdeki nokta dosyalarının, ör. foo / bar / .foobar bu komutla taşınmaz. @Phatblat
lea

10

@ StephaneDelcroix'in cevabına ek olarak, kullanmadan önce:

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

kullanarak geçerli yönünüzün boş olduğundan emin olun

ls -a

Bugün bu sorunla karşı karşıyayız. Depoyu klonlamaya çalıştığım dizinde gizli .git ve .gitignore klasörleri olduğu ortaya çıktı. Bu klasörleri kaldırdığımda her şey yolunda idi.
Tamara

Geçerli dizini boşaltmak için komut ne olurdu? Ben sadece kontrol daha yararlı olacağını düşünüyorum :)
pie6k

9

Çözüm: Bu durumda, çözüm şunu kullanıyordu dot, bu yüzden:rm -rf .* && git clone ssh://user@host.com/home/user/private/repos/project_hub.git .

rm -rf .* && dizinin boş olduğundan kesinlikle eminsek ihmal edilebilir.

Kredi: @James McLaughlin aşağıdaki yorumlar hakkında gidin.


10
Bu kötü görünüyor, çünkü. * Üst dizini içeriyor! ben: ~ / tmp / tmp / tmp $ ls -d .* . .. bana: ~ / tmp / tmp / tmp $
stackunderflow

Bu yardımcı olmaz, çünkü ben dizinde dışarı ödeme gereken bağımlılıkları var.
b01

18
Bazı GERÇEKTEN KORKUNÇ uyarı işareti olmadan bir SO yanıt içine rm -rf (herhangi bir biçimde) yazmak akıllıca emin değilim. Bazı deneyimsiz kullanıcılar buraya "yeşil onay işareti" (genellikle en iyi cevap) aramaya gelebilir ve sonra bu komutu kopyalayıp yapıştırabilir ... mevcut dizinde zor işleri gider. BTW: rm -rf ./.*geçerli dir altındaki gizli (nokta) dosyaları ve dizinleri kaldırırsanız (daha önce @stackunderflow gibi). Ancak rm -rfdeneyimsiz kullanıcılar için tehlikeli bir komuttur, bu yüzden dikkatli olun! Sadece 2 sentim.
Andrew

1.7.1 üzerinde çalışır İçindeki tek klasör .gitsonra git init(biliyordum)
vladkras

-rfNormal dosyaları silmenize gerek yoktur . Lütfen bu yanıtı silmeyi veya en azından farklı bir yanıtı kabul etmeyi düşünün.
Navin

6

@ GoZoner'ın cevabında iyileştirme:

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

Shopt komutu bu SO yanıtından alınır ve Bash üzerindeki 'mv' komutunun davranışını .git dizinini ve diğer gizli dosyaları dahil etmeniz gereken dotfiles'ı içerecek şekilde değiştirir.

Ayrıca, yalnızca geçerli dizinin (.) Boş olması durumunda olduğu gibi çalışacağının garanti edildiğini, ancak klonlanan repodaki dosyaların hiçbirinin geçerli dizindeki dosyalarla aynı ada sahip olmadığı sürece çalışacağını unutmayın. Geçerli dizinde ne olduğu önemli değilse, 'mv' komutuna -f (force) seçeneğini ekleyebilirsiniz.


6

Aynı ihtiyacım vardı. Benim durumumda, bir web sunucusu yüklemesi tarafından oluşturulan standart bir web klasörü vardı. Bu çizimin amaçları için diyelim ki

/server/webroot

ve webroot diğer standart dosya ve klasörleri içerir. Repomda sadece siteye özgü dosyalar (html, javascript, CFML, vb.) Var

Tek yapmam gereken:

cd /server/webroot

git init

git pull [url to my repo.git]

Git init'i hedef klasörde yapmaya dikkat etmelisiniz, çünkü eğer YAPMAYINIZ iki şeyden biri gerçekleşmeyecektir:

  1. Git çekme, benim durumumda git dosyası hakkında bir mesajla başarısız olur:

ölümcül: Git deposu değil (veya üst dizinlerden herhangi biri): .git

  1. Orada ise bir üst yolunda bir .git dosya yerde senin klasörüne çekti Repo .git dosyasını içeren OLDUĞUNU ebeveyn oluşturulur. Bu bana oldu ve ben şaşırdım ;-)

Bu benim webroot klasöründe "standart" dosyalardan herhangi birini rahatsız etmedi, ancak sonraki taahhütlere yanlışlıkla eklenmesini önlemek için .gitignore dosyasına eklemeniz gerekiyordu.

Bu boş olmayan bir dizine "klonlamak" için kolay bir yol gibi görünüyor. Çekme tarafından oluşturulan .git ve .gitignore dosyalarını istemiyorsanız, çekildikten sonra bunları silin.


5

@ Phatblat'ın cevabı üzerinde daha fazla gelişme :

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

bir astar olarak:

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
Kodunuzun sorunu neden çözdüğünü ve ne işe yaradığını açıklamak için daha fazla bilgi sağlayın.
Martin

"git clone ... tmp" - komutun yürütüldüğü dizinde / tmp klasörü oluşturur ve Git deposunu klonlar. Sonra "mv tmp / *." - tüm dosyaları üst klasördeki / tmp klasöründen taşır (önceki komutun yürütüldüğü yer) ve son olarak "rm -rf tmp" - / tmp klasörünü kaldırır.
Marinski

1

komutunuzun sonunda aşağıdaki gibi. (nokta) kullanın

git klon URL'si .


Bu mac üzerinde çalışmaz, hataya neden olur: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz

Mac için :: Üst dizin altında olmalısınız ve sonra aşağıdaki gibi klasör adını kullanmalısınız. Git dot klon URL flodername Klasörünüzün boş olduğundan emin olun.
Upendra

0

İşte buldum:

Bunu görüyorum:

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

Aramalarım arasında tökezledim:

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

Clinton'ın girişini arayın.Hall ... Bunu denediğimde (yaptığım gibi), muhtemelen access denied ilk hatası (benim için), aslında yanlış köküne eluding bu yüzden yanıtı, benim 1 ipucu vardı konu.

Windows'ta bunun için çözüm: Çalıştırdığınızdan emin olun cmdveya git elevatedçalıştırın:

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

Yukarıda benim sorunum vardı ve sadece yükseltmek benim için çalıştı.


0

Çözümü Windows, havuzu başka bir klasöre klonlamak ve daha sonra orijinal konuma kopyalayıp yapıştırmak veya sadece .gitgörünmez klasörü kopyalamaktır .


-1

İle kaldırma

rm -rf. *

başınızı belaya sokabilir veya daha fazla hata yapabilir.

/ Path / to / klasörünüz varsa ve içindeki her şeyi kaldırmak istiyorsanız, ancak o klasörü değil, çalıştırın:

rm -rf / yol / klasör / /


-1

Bu yüzden aynı hatayı kök dizinimdeki gizli .git klasörünü silerek ve sonra 'git clone repo' ya bir nokta ekleyerek düzelttim. root / dist klasörümde. Bu bir vue-cli webpack projesi bağlamında. Bu yüzden herkesin söylediği doğru, bu genellikle klonlamaya çalıştığınız klasörde veya söz konusu klasörün üst klasöründe veya kökünde git izlemeniz olduğu anlamına gelir!


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

Eğer boş olmayan bir dosyada yapıyorsanız, bunun yine de soruda yayınlanan aynı hatayla sonuçlanacağını unutmayın (" ölümcül: hedef yol 'çözümlendi / yol / / pwd' zaten var ve boş bir dizin değil. ") . dizin.
Gino Mempin


-2

mkdir filenamekomutunu çalıştırarak yeni bir dosya oluşturmak yararlıdır git clone xxxxx, bilgisayarımda çalışır


-3

Bu soruyu birçok kez gördüm - ve sadece şunu belirtmek istiyorum git pull dizininizden hile yapacağını .

Burada bir şey eksik olmadıkça - bu benim için çalıştı.


5
git pulltanımlı herhangi bir deponuz yoksa hiçbir şey git cloneyapmaz.
hackel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.