Kaynak denetimi meta verileri olmadan projenin çalışan bir kopyası var. Şimdi, bu klasöre git-clone eşdeğerini yapmak ve yerel değişiklikleri tutmak istiyorum.
git-clone varolan bir klasöre kopyalamama izin vermiyor. Buradaki en iyi uygulama nedir?
Kaynak denetimi meta verileri olmadan projenin çalışan bir kopyası var. Şimdi, bu klasöre git-clone eşdeğerini yapmak ve yerel değişiklikleri tutmak istiyorum.
git-clone varolan bir klasöre kopyalamama izin vermiyor. Buradaki en iyi uygulama nedir?
Yanıtlar:
Bu, yeni bir dizine klonlayıp ardından .gitdizini mevcut dizininize taşıyarak yapılabilir .
Mevcut dizininiz "kod" olarak adlandırılmışsa.
git clone https://myrepo.com/git.git temp
mv temp/.git code/.git
rm -rf temp
Bu, klon komutu sırasında bir ödeme yapmadan da yapılabilir; daha fazla bilgiyi burada bulabilirsiniz .
git cloneilk komut olarak kullandığınız sürece başka bir çıkış komutu gerekmez. Bunun yerine git clone --no-checkoutilk adımda olduğu gibi bir şey kullanırsanız , .git dizini taşındıktan git reset HEADsonra dosyaların silinmediğini söylemek için kullanılması gerekir.
git status.
Klonlama, yerine getir. Depoda:
git init
git remote add origin $url_of_clone_source
git fetch origin
git checkout -b master --track origin/master # origin/master is clone's default
Ardından istediğiniz taahhüdü almak için ağacı sıfırlayabilirsiniz:
git reset origin/master # or whatever commit you think is proper...
ve sen klonlanmış gibisin.
Buradaki ilginç soru (ve cevapsız olanı): Çıplak ağacınızın hangi taahhüdüne, dolayısıyla hangi konuma sıfırlanacağına nasıl karar verilir.
Varolan bir dizinde ana dal ödeme için aşağıdakileri yaptım:
git init
git remote add origin [my-repo]
git fetch
git checkout origin/master -ft
-tBurada bayrağın neden kullanıldığını açıklayabilir misiniz?
Ben isterdim git cloneyeni bir dizine ve yeni klon mevcut dizinin içeriğini kopyalayın.
git clone wherever tmp && git mv tmp/.git . && rm -rf tmpBaşka bir deyişle, .gitdizini geçici bir klondan çıkarmak, klonun çalışma ağacını temizlemek ve mevcut dosyaları oraya kopyalamaktan daha basit görünüyor.
git mv tmp/.git .geri dönüyor fatal: cannot move directory over file, source=tmp/.git, destination=.git. Sorunun ne olduğunu bilen var mı?
mv, değil git mv; ancak bu, neden .gitorada zaten bir dosyanız olduğunu açıklamıyorsa ( gitdir: some/path/to/a/git-dirbir “gitfile” içeren ; orada olmasaydı, fatal: Not a git repository (or any of the parent directories): .gitbunun yerine onu görürdünüz ).
Temp dizini kullanmak iyidir, ancak bu adımdan kaçınmak istiyorsanız bu işe yarar. Çalışma dizininizin kökünden:
$ rm -fr .git
$ git init
$ git remote add origin your-git-url
$ git fetch
$ git reset --mixed origin/master
git reset --hard origin/masteryerel dosyaları kaldıracaktır.
hardve mixedkarışık yerel değişiklikleri tutacak olmasıdır (daha sonra sizi örn göstereceğiz çekmeye çalışmayın eğer öyleyse : Sen unstaged değişiklikler var işlemeye veya bunları saklamak Lütfen rebase ile çekin olamaz. ) , zor bu yerel değişiklikleri
git clone your_repo tmp && mv tmp/.git . && rm -rf tmp && git reset --mixed
git reset --hardyerel dosya değişiklikleri, özellikle bu OP talep ne nuke. --mixedyerine kullanılmalıdır.
Git deposunu boş bir dizine kopyalamak için aşağıdakileri yapın:
cd myfolder
git clone https://myrepo.com/git.git .
Komutunuzun .sonunda olduğuna dikkat edin git clone. Bu, repo'yu geçerli çalışma dizinine indirir.
fatal: destination path '.' already exists and is not an empty directory.
Buna iki yaklaşım var. Mümkün olduğunda, yeni git çalışma dizininiz için temiz bir klasörle başlayıp daha sonra şeylerin sürümünüzü kopyalarım. Bu şuna benzeyebilir *:
mv $dir $dir.orig
git clone $url $dir
rsync -av --delete --exclude '.git' $dir.orig/ $dir/
rm -rf $dir.orig
Bu noktada, geçerli çalışma dizini olarak önceki çalışma klasörünüzle oldukça temiz bir çalışma kopyasına sahip olmalısınız, böylece herhangi bir değişiklik dosya silme işlemlerini çalıştırırsanız radarda görünecektir git status.
Öte yandan, bunu gerçekten başka bir şekilde yapmanız gerekiyorsa, aynı sonucu şu şekilde alabilirsiniz:
cd $dir
git clone --no-checkout $url tempdir
mv tempdir/.git .
rmdir tempdir
git reset --mixed HEAD
Her iki durumda da, yapacağım ilk şey git stash, tüm yerel değişikliklerinizin bir kopyasını bir kenara koymak gibi bir şey çalıştırmaktır , daha sonra bunları yeniden uygulayabilir ve hangilerini taahhüt etmek istediğinizi çalışabilirsiniz.
* Her iki örnek de projenizin üst dizinindeki kabukta başladığınızı varsayar.
Bu, karşılaştığım tüm yöntemlerin en iyisi
Yalnızca deponun .git klasörünü (zaten var olan dosyalar hariç existing-dir) boş bir geçici dizine kopyalayın
git clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp // isteyebilir - yerel repoyu kopyalamak için hiçbir bağlantı yok.Git klasörünü dosyaların bulunduğu dizine taşıyın. Bu existing-dirbir git repo yapar .
mv existing-dir/existing-dir.tmp/.git existing-dir/Geçici dizini silme
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git tüm dosyaların silindiğini düşünür, bu da repo durumunu HEAD'e döndürür.
UYARI: dosyalarda yapılan yerel değişiklikler kaybolacaktır.
git reset --mixed HEADEğer (öğretti en azından budala 1.7.7 kullanıyorsanız seçeneği), bir çalışma kopyası haline geçerli dizini açmak için:clone--config
git clone example.com/my.git ./.git --mirror --config core.bare=false
Bu şu şekilde çalışır:
.gitklasöre kopyalama--mirroryeni klonu .gitgerektiği gibi tamamen meta veri klasörüne dönüştürür--config core.bare=falseseçeneğin örtükünü bare=trueortadan kaldırır --mirror, böylece havuzun ilişkili bir çalışma dizinine sahip olmasına ve normal bir klon gibi davranmasına izin verirÇalışmakta .gitolan bir kopyaya dönüştürmek istediğiniz dizinde zaten bir meta veri dizini varsa, bu kesinlikle işe yaramaz .
[core] dahil olmak üzere yerel yapılandırma bölümünde sonuçlanacağını unutmayın . Daha sorunlu, uzaktan kumanda için yanlış değerlere sahip olması, bölüm dahil ve çalışan bir kopyayla düzgün çalışmayan bir getirme özelliğiyle olmasıdır. Bu sorunları çözdükten sonra, normal olarak klonlama ve yeni çalışan kopyaların taşınması daha verimli olacaktır. bare = true bare = falseorigin[remote "origin"]mirror = true.git
Genellikle ilk depoyu klonlayacağım ve sonra varolan klasördeki her şeyi ilk depoya taşıyacağım. Her seferinde çalışır.
Bu yöntemin avantajı, README veya .gitignore dahil ilk depodan hiçbir şeyi kaçırmamanızdır.
Adımları tamamlamak için aşağıdaki komutu da kullanabilirsiniz:
$ git clone https://github.com/your_repo.git && mv existing_folder/* your_repo
Aşağıdaki komut satırlarını özyinelemeli olarak yazarak yapabilirsiniz:
mkdir temp_dir // Create new temporary dicetory named temp_dir
git clone https://www...........git temp_dir // Clone your git repo inside it
mv temp_dir/* existing_dir // Move the recently cloned repo content from the temp_dir to your existing_dir
rm -rf temp_dir // Remove the created temporary directory