Git deposu başka bir dizine nasıl taşınır ve bu dizini git deposu nasıl yapılır?


102

Ben bir dizin var gitrepo1 . Bu dizin bir git deposudur.

  • Bu gitrepo1'i newrepo adlı başka bir dizine taşımak istiyorum .

  • Newrepo dizini , git geçmişinde kayıp olmadan yeni git deposu olmalı ve gitrepo1 dizinini içermelidir .

  • Dizin gitrepo1 sadece (iç şimdi bir dizin olmalıdır newrepo hiçbiri olmadan) .gityani artık bağımsız bir git depo veya bir alt modül olmalıdır indeksi.

Bunu nasıl yapabilirim?


9
mv girepo1 newrepo??
ddavison

Yanıtlar:


111

Çok basit. Git, dizininin adının ne olduğunu umursamıyor. Sadece içinde ne olduğu umurunda. Böylece şunları yapabilirsiniz:

# copy the directory into newrepo dir that exists already (else create it)
$ cp -r gitrepo1 newrepo

# remove .git from old repo to delete all history and anything git from it
$ rm -rf gitrepo1/.git

Depo büyükse ve uzun bir geçmişe sahipse, kopyanın oldukça pahalı olduğunu unutmayın. Bunu da kolayca önleyebilirsiniz:

# move the directory instead
$ mv gitrepo1 newrepo

# make a copy of the latest version
# Either:
$ mkdir gitrepo1; cp -r newrepo/* gitrepo1/  # doesn't copy .gitignore (and other hidden files)

# Or:
$ git clone --depth 1 newrepo gitrepo1; rm -rf gitrepo1/.git

# Or (look further here: http://stackoverflow.com/q/1209999/912144)
$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Bir kez oluşturduğunuzda newrepo, koyacağınız hedef gitrepo1her yerde, hatta newrepoisterseniz içeride olabilir. Prosedürü değiştirmez, sadece yazdığınız yolu değiştirir gitrepo1.


6
+1. Muhtemelen git sürüm 1.7.8 veya 1.7.9 ile oluşturulan depoları etkileyen bu olaydan bahsetmeye değer - bu, bir git deposunun taşınmasının onu kullanılamaz hale getirdiği anlamına gelebilir (ancak belirtildiği gibi kolayca düzeltilebilir).
AD7six

1
wndows makinesindeyim ve komut istemini kullanıyorum. "cp" komutunu bulamadım. "cp" komutu diğer işletim sistemlerine özel mi?
LP13

2
@ user3862378, cphemen hemen her komut veya işlev gibi diğer işletim sistemlerine özgüdür. Aslında, pencere olmayan her işletim sistemine özgüdür. Microsoft'u aramayı ve onlara neden POSIX olmadıklarını sormayı deneyin. Neyse, cpkopyala demektir. mvhareket etmek demektir. rmkaldırmak anlamına gelir. Windows eşdeğerlerini bulabilirsiniz.
Shahbaz

@Shahbaz Teşekkürler, yukarıdaki çözüm "newrepo ->. Git" ve "newrepo-> gitrepo1'deki diğer tüm dosyalar" yapısını oluşturuyor ... "gitrepo1" klasörünü "newrepo" içine koymuyor .. merak ediyorum eğer Windows'ta elle klasör oluşturmak ve ".git" klasörünü kök klasör altına taşımak .. geçmişi etkilemeden çalışır mı?
LP13

2
@ user3862378, olmaması için hiçbir neden yok. .git/en son işleminizi içeren tüm geçmişi içerir. Onu nereye koyarsanız koyun, tüm tarihe sahipsiniz. Aslında, bu dizindeki tüm dosyalar aldığınız orijinal depodan farklıysa .git/, tek şey size bazı dosyaların silindiğini ve bazı izlenmemiş dosyaların mevcut olduğunu söylemesi olacaktır. A ile git reset --hardkaldırılan dosyalar otomatik olarak kurtarılacaktır! Unutulmaması gereken tek şey, yalnızca kopyalayarak .git/, taahhüt edilmeyen değişiklikleri kurtaramayacağınızdır.
Shahbaz

4

Biraz geç ve soru zaten cevaplandı, ancak bunu baş ağrısız yapmak için:

  1. Eski git klasöründe bulunduğunuz mevcut şubeye bir göz atın git status, diyelim ki şube geliştirme
  2. Dizini yeni git klasörüne, ardından depodan yeni klasöre git cloneprojeyi değiştirin
  3. Yeni klasörünüzdeki mevcut şubeye göz atın: git checkout development
  4. Kullanarak, eski biriyle yeni bir klasör syncronize rsync, .git klasörü hariç :rsync -azv --exclude '.git' gitrepo1 newrepo/gitrepo1

O zaman kaldığın yerden devam etmen iyi olur


4

Hatta bundan daha basit. Bunu az önce yaptım (Windows'ta, ancak diğer işletim sistemlerinde çalışması gerekir):

  1. Newrepo oluşturun .
  2. Taşı gitrepo1 içine newrepo .
  3. Hareket .git gelen gitrepo1 için newrepo (Bir seviye kadar).
  4. Değişiklikleri uygulayın (izlemeyi gerektiği gibi düzeltin).

Git, bir dizin eklediğinizi ve bir grup dosyayı yeniden adlandırdığınızı görüyor. Önemli değil.


Bana göre bu doğru cevap gibi görünüyor (kabul edilen cevabın aksine, git geçmişinin kaybolmasına yol açmaz).
Marses

@Marses: Tnx. (Bir git sorusunu yanıtladığıma hâlâ inanamıyorum!)
david.pfx

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.