Boş olmayan bir dizine nasıl klonlayabilirim?


573

D diziniyle eşleşen dosyaları olan A dizinim var. Dizin A'da başka gerekli dosyalar olabilir. B Dizini bir git deposudur.

B dizinini A dizinine kopyalamak istiyorum ama git-clone dizin boş olmadığından bana izin vermiyor.

Ben sadece .git klon umuyordum ve tüm dosyaları maç beri oradan gidebilir miyim?

Boş bir dizine klonlayamıyorum çünkü A dizininde B dizininde olmayan dosyalara sahibim ve onları tutmak istiyorum.

.Git kopyalamak bir seçenek değildir, çünkü referansların itmesini / çekmesini istiyorum ve bunları manuel olarak ayarlamak istemiyorum.

Bunu yapmanın bir yolu var mı?

Güncelleme: Bence bu işe yarıyor, herhangi bir sorun görebiliyor mu? ->

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

5
belki kabul edilen cevabı değiştirebilirsin?
Bastiaan Quast

Yanıtlar:


724

Bu benim için çalıştı:

git init
git remote add origin PATH/TO/REPO
git fetch
git reset origin/master  # Required when the versioned files existed in path before "git init" of this repo.
git checkout -t origin/master

NOT: -t İstediğiniz şeyse, yukarı akış dalını sizin için ayarlayacaktır ve genellikle öyledir.


70
Gelen dosyalar zaten mevcut olduğunda (orijinal soruda açıklandığı gibi) bu, boş olmayan bir dizinde çalışmaz. Ama eğer git reset origin/mastersonra, git fetchişe yarayacak (ayrıca yerel değişiklikleri koruyarak).
Araxia

8
ölümcül: Yollar güncellenemez ve aynı zamanda 'master' şubesine geçilemez.
Arnold Roa

7
Bu cevap benim için işe yaramıyor. Ben ne zaman git checkout ...git Tüm dosyalarım üzerine yazılır olacağını şikayet ve ben ilk taşımak gerekir. `Git reset origin / master /` ı ilk yaptığımda, ödeme komutu master adlı bir şubenin zaten var olduğundan şikayet eder.
Saskia

4
git checkout masterbenim için yeterli bir son adımdı.
yoyo

16
Tüm adımlar mükemmel çalıştı ama sonuncusu beni: fatal: A branch named 'master' already exists. Gerçekten ihtiyacım olmadığını düşünüyorum.
Shadi

164

Aşağıdaki kabuk komutlarında existing-dir, içerikleri repo-to-clonegit deposundaki izlenen dosyalarla eşleşen bir dizin bulunur .

# 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

5
Yapmam gerekiyordu git reset --hard HEADveya "silinmiş" dosyalardan vazgeçmezdi.
Dimitar

18
git reset HEADbenim için iyi çalıştı. git reset --hard HEADdosyalarınızdaki değişiklikleri yok eder, bu nedenle depodaki dosyalarla tam olarak aynı değilse, bunu yapmamalısınız.
Tgr

1
git reset HEADbenim için herhangi bir etkisi yok gibi görünüyor. git reset --hard HEADancak dosyalarda yaptığınız değişiklikleri kaybeder. Daha iyi bir çözüm var mı?
Jacob Dorman

1
@ Casey'nin cevabı - git init / uzaktan ekleme / getirme / ödeme - daha temiz ve basittir ve herhangi bir geçici klasör gerektirmez.
yoyo

1
@ Klasörlerde kalması gereken dosyalar olduğu halde git repo'sunda olmadığında Casey'nin yanıtı benim için işe yaramadı. Bu, dosyaların ve dizinlerin oluşturulduğu yükleme komut dosyalarını çalıştırdıktan sonra yapılandırmayı güncellemek için yararlıdır, ancak yüklü öğelerin üzerine dosyaları güncellemeniz / eklemeniz gerekir.
soulston

104

Benim için çalışan cevaplardan birinde küçük bir değişiklik:

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

ana dalda hemen çalışmaya başlayalım.


1
gitignore'da belirtilen alakasız dosyaları kaldırmadan, mevcut kirli dizini temizlemek için HEAD --hard'ı sıfırlamak zorundaydı
Ray Foss

1
@ Cmcginty'nin cevabının aksine, aslında benim için çalışan budur.
certainlyakey

4
Bu git-klonuna tam olarak eşdeğer değildir - eksik olan ana dal için yukarı akış bilgisidir. Bu ekleyerek düzeltilebilir git branch --set-upstream-to=origin/master master.
Slaven Rezic

Bu sürüm benim için çalıştı, sadece git reset yapmak zorunda kaldı
Frédéric Klee

29

Uyarı - bu, dosyaların üzerine yazılabilir.

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

Dan Modifiye @ cmcginty cevabı - bunun -f benim için iş vermedi olmadan


Şüphesiz bundan sonra tüm dosyaları kontrol etmeniz gerekiyor git checkout .mu?
Chris Stryczynski

25

İşte aynı sorunu yaşadığımda yaptığım şey (en azından aynı sorun olduğunu düşünüyorum). A dizinine girdim ve koştumgit init .

A dizinindeki dosyaların git ile takip edilmesini istemediğim için .gitignore'u düzenledim ve mevcut dosyaları buna ekledim. Bundan sonra ben git remote add origin '<url>' && git pull origin masteret voíla koştum , B tek bir hıçkırık olmadan A'ya "klonlanır".


2
Gelen dosyalar zaten mevcut olduğunda (orijinal soruda açıklandığı gibi) bu teknik boş olmayan bir dizinde çalışmaz.
Araxia

11

Bunu birkaç dakika önce kullandım, potansiyel olarak en az yıkıcı komutları gerektirir:

cd existing-dir
git clone --bare repo-to-clone .git
git config --unset core.bare
git remote rm origin
git remote add origin repo-to-clone
git reset

Ve voilá!


10

Başka bir basit tarif benim için iyi çalışıyor gibi görünüyor:

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

Varolan dosyaları içeren bir dizine göz atmak için ana kullanım durumum, Unix dotfiles'leri Git ile denetlemektir. Yeni bir hesapta, giriş dizininde zaten bazı dosyalar olacak, muhtemelen Git'ten almak istediklerim bile.


1
Çıplak depolar biraz farklı kurulur ve bu çalışırken ben bunu tavsiye etmem. :)
ThorSummoner

1
Daha spesifik olabilir misiniz? Farklı olan nedir?
Ken Williams

1
Yalnızca iki fark vardır: 1.) .git/configDosya, depoların çıplak olduğunu gösterir. 2.) Normalde depolanan dosyalar .gitkökte saklanır (sizin .git
adınıza

4
Bunlar tam olarak klonlamanın .gitve ayarlanmanın core.baregerekli olduğu değişikliklerdir false, bu yüzden hala bu yöntem hakkında iyi hissediyorum.
Ken Williams

10

Bu benim için çalıştı:

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

6

Hazırlama web sunucusu olarak kullanmayı planladığım yeni bir Apache web dizininde (WHM ile oluşturulan hesap) benzer bir sorun yaşadım. Başlangıçta orada kod tabanı ile yeni projemi klonlamak ve depodan çekerek değişiklikleri düzenli olarak dağıtmak gerekiyordu.

Sorun, hesabın zaten aşağıdaki gibi web sunucusu dosyaları içermesiydi:

.bash_history
.bash_logout
.bash_profile
.bashrc
.contactemail
.cpanel/
...

... depomu silmek ya da taahhüt etmek istemediğim için. Onlara sadece orada tatsız ve izlenmemiş kalmak gerekiyordu.

Ben ne yaptım:

Web klasörüme gittim (mevcut_folder):

cd /home/existing_folder

ve sonra:

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

Başlangıçta cPanel web hesabımda zaten mevcut olan pek çok aşamalı olmayan dosyaların bir listesini (beklendiği gibi) görüntüledi.

Sonra, bu makale sayesinde , sadece bu dosyaların listesini ekledim:

**.git/info/exclude**

Bu dosya, tıpkı .gitignoredosya gibi, dosyaların sahnelemesini yok saymanızı sağlar. Bundan sonra .git / dizininde işlem yapmak için hiçbir şeyim yoktu - kişisel olarak çalışıyor.gitignore başka hiç kimsenin göremediği .

Şimdi git statusiade kontrol ediliyor:

On branch master
nothing to commit, working tree clean

Şimdi sadece git depomdan çekerek bu web sunucusunda değişiklikler yapabilirim. Umarım bu, bazı web geliştiricilerinin kolayca bir hazırlama sunucusu oluşturmasına yardımcı olur.


5

İşte yaptığım şey:

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

4

Belki sorunuzu yanlış anladım, ancak dosyaları A'dan git repo B'ye kopyalayıp taşırsanız ve git add ile gerekli olanları eklerseniz daha kolay olmaz. mı?

GÜNCELLEME: git doc'dan:

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

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


2
Hayır, dosya sahibi ve dosyalar isteğe bağlı olabilir. Bu, birden fazla geliştiricinin olduğu bir durum içindir. Hepimizin mevcut dizinleri var ve sadece bir tanesi şu anda bir git kontrolüne sahip. Hepimiz büyük ölçüde aynı dosya alt kümesine sahibiz, bu yüzden diğer geliştiricilerin dosyalarını korurken klonlamalarını istiyoruz. Ve mümkün olduğunca zarif ve kullanışlı olmalıdır.
Dale Forester

Dürüst olmak gerekirse, böyle bir durumda gelişme noktasını görmüyorum. Şubeler ve birleştirme işlemleri kullanamaz mısınız? Veya harici bağımlılıkları olan alt depolarınız mı var? Neden tek bir "git kasası" na güvenmek istersiniz?
Roberto Aloi 9.09.2010

5
Bir "tek git kasası" tüm çileğin noktası değildir. Sadece bu şekilde ve ilerlemenin bir yoluna ihtiyacımız var. Orijinal soruyu çalışıyor gibi görünen bir çözümle güncelledim. Yine de geri bildirimi takdir ediyorum.
Dale Forester

3
Bunun için çok sayıda meşru durum var - Projemin kaynağı ayarlanmadan ÖNCE ayarlanması gereken karmaşık bir klasör ağacım var ve bu klasör ağacı GitHub'da depolanamayan lisanslı eserler içeriyor.
BrainSlugs83

3

Ben de benzer bir şey arıyordum ve işte burada buldum:

Benim durumum, aktif bir web ağacına sahip olduğum yerdir ve mevcut web ağacındaki herhangi bir dosyayı taşımadan bunun için uzak bir havuz oluşturmaya çalışıyordum. İşte yaptım:

  1. Web ağacına git ve koş git init
  2. Deponun amaçlanan yerine gidin ve çalıştırın: git clone --bare /path/to/web/repo
  3. Uzak depomdaki yapılandırma dosyasını düzenleyin ve [remote "origin"]bölümü kaldırın .
  4. [remote "origin"]Web ağacında .git / config dosyasına yeni uzak repo'yu işaret eden bir bölüm ekleyin .

Bu tarifi çok beğendim.
dland

Burası git clone --baregereksiz ve dolambaçlı. Neden sadece git remote add origin <URL>ilk etapta değil?
Araxia

3

bu benim için bir iş , ancak uzak depo dosyalarını yerel dosyalarla birleştirmelisiniz:

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

1

Dale'in cevabını beğendim ve ayrıca

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

Sığ derinlik, fazladan erken dev işlemlerinden kaçındı. Yeni şube bize bu sunucudan yerleştirilmiş bazı yeni kodlar olduğu konusunda iyi bir görsel geçmiş verdi. Bu bence mükemmel kullanım dalları. Burada yer alan tüm insanların büyük içgörüleri için teşekkürler.


0

C / kod klonlamaya çalışırken aynı sorunları var

Ancak bu klasör bir sürü proje içeriyor.

C / code / newproject içinde yeni bir klasör oluşturdum ve klonumu bu klasöre eşledim.

git masaüstü için sonra kullanıcı sordu ve sonra iyi klonladı.

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.