Git depom yanlış kök dizinde. Hareket ettirebilir miyim? (../ onun yerine ./)


118

Her nasılsa git initen son projemi bir ay kadar önce yaptığımda, komutu projemin kökünden bir dizinin üstündeki dizinde çalıştırdım.

Yani benim depom ./projectdizinde değil ./project/my-new-projectdizinde. Daha önce sorunu nasıl anlamadım bilmiyorum ama şimdiye kadar .git dizinini hiç aramadım.

Projemi sonlandırmadan, depoyu uygun dizine taşımanın ve sonra git'e projenin yeni temelinin ne olduğunu söylemenin bir yolu var mı? Sadece dizini taşımak işe yaramıyor. Git, tüm dosyaların silindiğini düşünüyor.

Yanıtlar:


19

Muhtemelen en basit şey, kaydetmek istediğiniz bazı geçmişleri zaten oluşturmadıysanız, sadece .gitalt dizini silmek ve initi doğru dizinde yeniden yapmak olacaktır.

Sorunu çözmek için git'i kullandıysanız, herhangi bir çözüm, aslında değişmeyen çok sayıda "bu dosyayı buraya taşıdı" geçmiş girişlerini geride bırakacaktır, ancak oluşturma sırasında bir hatayı düzeltirsiniz. Doğru şekilde yaratmak daha iyidir.


2
Ne dediğinizi anlıyorum, ancak bunu düzeltmek için yaptığınız herhangi bir in-git eylemi, gerçekte değişmeyen bir sürü "bu dosyayı buraya taşıdı" geçmişleri bırakacaktır, ancak yaratma sırasında bir hata düzeltiyorsunuz. Doğru şekilde yaratmak daha iyidir.
TED

8
Bu pek çok şeyi bozar. stackoverflow.com/a/3247756/825364 bunu yapmanın çok daha iyi bir yoludur.
Steve Tauber

2
Eh, biraz geçmişi kaydetmek için Git kullanılır. Belki de .git alt dizinini silmeli ve Git'i sistemimizden kaldırmalıyız? Vcs yerine bir ftp sunucusu kullanmak, muhtemelen en basit şeydir!
Gherman

2
Aşağıdaki cevap, tüm geçmişi koruduğu için çok daha iyi bir yaklaşımdır
BigMikeW

2
Bu yüzden benim için bunu yaptım ve hemen hatamı anladım. Endişelenecek herhangi bir değişiklik olmadan, temiz bir sayfaya geri dönmenin en kolay yolu budur.
Mike

261

Tam tersi bir problem yaşadım - git kökünü ana dizine kaydırmak zorunda kaldım (proje / src'den projeye) Aşırı sürprizime, aşağıdakiler işe yaradı!

src$ mv .git ../ 
src$ cd ..
project$ git add src
project$ git commit -a

git, tüm yeni dosyaların eski dosyaların yeniden adlandırıldığını ve geçmişin kaybolmadığını akıllıca tespit etti

Benzer bir şey deneyebilirsiniz ... .git klasörünü taşıyın ve kaydetmeden önce dosyaları tekrar ekleyin


8
Bu benim için mükemmel çalıştı. Ayrıca .gitigore gibi dizinden diğer .git * yapılandırma dosyaları taşındı
Relequestual

7
Sevgili efendim, siz bir hayat kurtarıcısınız. Bu şey gerçekten çalışıyor. Teşekkür ederim.
Radu Murzea

1
Ek olarak, git rm'ddosyaları eski konumlarından aldım, bu nedenle git status(doğru şekilde) bir dizi yeniden adlandırma işlemi bildirdim. Git ile ne kadar çok çalışırsam, onu o kadar çok seviyorum.
ssc

7
@Mike bu, kabul edilen cevap olarak işaretlenmelidir. Geçmişi kaybetmediğiniz için yeniden başlamak için tercih edilen bir çözümdür. Bana inanmıyorsanız, olumlu oy sayısı kendi adına konuşuyor.
Joseph Spens

3
Teşekkür ederim! Benim için çalıştı, ancak birkaç şey daha yapmam gerekiyordu: 1. Taahhüt etmeden önce, güncelledim .gitignoreve git add -Akök klasörde çalıştırdım; bundan sonra git, tüm dosyaları renamedyerine doğru olarak gösterdi deleted. 2. Alt modülleri kullandığım .gitmodulesiçin, yeni köke geçmem ve çeşitli git yapılandırma dosyalarındaki alt modül yolunu güncellemem gerekiyordu. Hangi dosyaları değiştireceğimi bulmak için çalıştırdımgrep -nrI --color 'old/path/to/submodule' .
Guido Walter Pettinari

43

Bu benim için çalıştı ve tüm geçmişimi sağlam tuttu. Yanlış kök klasörden (depoyu yanlışlıkla başlattığınız ana klasör):

Klasörü taşıyın:

mv .git thecorrectfolder/

Git deposunu yeniden başlatın:

cd thecorrectfolder/
git init

Tüm dosyaları yeniden ekleyin, kesin ve aktarın:

git add .
git commit -am 'fixing things'
git push origin master

Bitti! Kendine bir bira al.

Yeniden başlattıktan sonra git deposunu işlediğinizde, şuna benzer bir dizi çıktı alırsınız:

rename {ethanode/coffee => coffee}/app.coffee (100%)

Başka bir deyişle, ana klasördeki tüm referanslarınız ve doğru klasörü kullanmak için yeniden adlandırılıyor.


Teşekkürler! Bu yöntem tam da ihtiyacım olan şeydi!
Giel Berkers

Bu benim için çalıştı, ancak biraz çirkindi. Git söz konusu olduğunda, hiçbir şeyi 'taşımadım', sadece yüzlerce dosyayı sildim ve yüzlerce başka, aynı dosya ekledim.
bjmc

6
git init gerekli değil ve kalan kısım sizinkinden yıllar önce verdiğim yanıtla aynı: stackoverflow.com/a/3247756/391753
Abhishek Anand

35

git filter-branchbu şekilde tarihi yeniden yazmanıza izin verir. git filter-branchAdam sayfası bile davanızı sahip bir örnek olarak :

Depoyu, sanki kendi proje kökü olmuş gibi görünecek şekilde yeniden yazmak ve diğer tüm geçmişi atmak için:

git filter-branch --subdirectory-filter foodir -- --all

Muhtemelen çalıştırmadan git cloneönce (veya sonra?) Depoyu yeni bir alt dizine almak istiyorsunuz git filter-branch. (Filtre dalından önce klonlama ve filtre dalını yeni klonda çalıştırma, .git/bir şeyler ters gittiğinde orijinal dizini yedek olarak yerinde bırakma avantajına sahip olacaktır .)


1
Bu, "diğer tüm geçmişi atmaz " ( .gitalt dizinler "kök olarak düşünülürken" deponun en üst düzeyde kaldığını gösterir) - bu, depodaki diğer tüm dosyaları tam anlamıyla atacak ve tüm subdirectory/*dosyaları kök klasöre taşıyacaktır. .
Louis Maddox

Harika yanıt, ancak bir .gitignore dosyası varsa (izleniyorsa), bu işlemle kaybolacağını unutmayın. Ayrıca, git push --forcebundan sonra yukarı akış deposunu güncellemek için bir yapmanız gerekir .
waldyrious

12

Git dosyaları hash'leriyle hatırlayabilir,

Sadece .gitkök dizine taşıyın ve gittüm dosya değişikliklerini --allseçeneği ile hatırlamanızı söyleyin .

$ mv .git ../
$ cd ..
$ git add . --all 
$ git status // => you can see all the files recognized as renamed 100%
$ git commit -m "Moves repo to root directory."

3

git-mvDosyalarınızı uygun konuma "yukarı", ardından git-rm"yeni-projem" dizinine taşımak için kullanın .


Öteki yol bu. Tüm dosyalarımı git'in bulunduğu dizine taşımak istemiyorum (orada tonlarca başka şey var ... can sıkıcı olurdu) ve sonra git'i yukarı taşıyın. Depoyu projemin kök dizinine taşımak istiyorum.
Mike

2

Buraya depomu herhangi bir yere taşımanın bir yolunu aramaya geldim .

Muhtemelen, tek ben değildim, işte sonunda yaptığım şey:

https://git.wiki.kernel.org/index.php/GitFaq#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F Depomun çıplak kopyasını "git clone --mirror" da yaptım ve daha sonra ona artık çıplak kalmamasını söyledim, böylece dosyalar ortaya çıktı bu yeni klasörde. (Daha sonra dosyaların ve günlüğün görünüp görünmediğini kontrol edin.) Eski depoyu bir süre tuttu, her ihtimale karşı ...

Bu şekilde depomu geçmişi kaybetmeden hareket ettirebildim.

Saygılarımızla, Dinah


Yanılıyorsam düzeltin, ama öyle görünüyor ki, bunu sadece depo dizinini sadece dosya sistemi araçlarını kullanarak belirlenen konuma taşıyarak başarmış olabilirsiniz mv /path/to/the/old/location/of/the/repo /path/to/the/new/location/of/the/repo.
cueedee

2

Aynı problemi henüz yaşadıktan sonra nihai çözümüm şuydu:

  1. .Git klasörünü olması gereken yere taşıyın.
  2. .Git'i yeni taşıdığım klasöre değiştirin
  3. Klasör içeriğini git'in olması gerektiğini düşündüğü şekilde sıfırlayın: git reset --hard HEAD
  4. İçeriğin olması gerekenle eşleşip eşleşmediğini kdiff3 veya başka bir karşılaştırma aracı ile kontrol edin
  5. Artık sürümü kaldırılmış dosyaları eski konumdan silin.

Tarih üzerinde hiçbir etkisi olmadan sihir gibi çalıştı. - NB Bazı değişiklikler yaptıysanız, .git dizini taşınmadan önce bunları yaptığınızdan emin olun.


-3

Burada iki yol var:

  1. cd TheWrongDirectory rm -rf .git

  2. sadece .git klasörünü ve cd'yi doğru dizine SİLİN.

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.