Easy Way ™
Bunun öyle yaygın ve kullanışlı bir uygulama olduğu anlaşılıyor ki, Git'in derebileri bunu gerçekten kolaylaştırdı, ancak Git'in daha yeni bir sürümüne sahip olmanız gerekiyor (> = 1.7.11 Mayıs 2012). En son Git'in nasıl kurulacağı ile ilgili eke bakın . Ayrıca, orada gerçek dünya örneği de izlenecek altında.
Eski repoyu hazırla
cd <big-repo>
git subtree split -P <name-of-folder> -b <name-of-new-branch>
Not: <name-of-folder>
önde gelen veya arkadaki karakterleri İÇERMEMELİDİR. Örneğin, adlı klasör subproject
ZORUNLU subproject
DEĞİL olarak geçirilmelidir ZORUNLU./subproject/
Windows kullanıcıları için not: Klasör derinliğiniz> 1 olduğunda, <name-of-folder>
* nix tarzı klasör ayırıcıya (/) sahip olmalıdır. Örneğin, adlı klasör path1\path2\subproject
ZORUNLU olarak geçirilmelidirpath1/path2/subproject
Yeni repo oluştur
mkdir ~/<new-repo> && cd ~/<new-repo>
git init
git pull </path/to/big-repo> <name-of-new-branch>
Yeni repoyu GitHub'a veya herhangi bir yere bağlayın
git remote add origin <git@github.com:user/new-repo.git>
git push -u origin master
Temizleme içinde <big-repo>
, eğer arzu edilen
git rm -rf <name-of-folder>
Not : Bu, depodaki tüm geçmiş referansları bırakır.Girişte bir şifre işlemeyle ilgili endişeleriniz varsa veya klasörünüzün dosya boyutunu küçültmeniz gerekiyorsa aşağıdaki Ek'e bakın .git
.
...
Bakış
Bunlar yukarıdakiyle aynı adımlardır , ancak depom için kullanmak yerine tam adımımı izlerler <meta-named-things>
.
Düğümde JavaScript tarayıcı modüllerini uygulamak için sahip olduğum bir proje:
tree ~/node-browser-compat
node-browser-compat
├── ArrayBuffer
├── Audio
├── Blob
├── FormData
├── atob
├── btoa
├── location
└── navigator
Tek bir klasörü btoa
ayrı bir Git deposuna bölmek istiyorum
cd ~/node-browser-compat/
git subtree split -P btoa -b btoa-only
Artık yeni bir şubem var, btoa-only
sadece taahhütleri var btoa
ve yeni bir depo oluşturmak istiyorum.
mkdir ~/btoa/ && cd ~/btoa/
git init
git pull ~/node-browser-compat btoa-only
Sonra GitHub veya Bitbucket'te yeni bir repo oluşturuyorum ya da her neyse origin
git remote add origin git@github.com:node-browser-compat/btoa.git
git push -u origin master
Mutlu gün!
Not: Eğer bir ile repo oluşturduysanız README.md
, .gitignore
ve LICENSE
öncelikle çekmek gerekir:
git pull origin master
git push origin master
Son olarak, klasörü daha büyük depodan kaldırmak isteyeceğim
git rm -rf btoa
...
apandis
MacOS'ta en son Git
Homebrew kullanarak Git'in en son sürümünü edinmek için :
brew install git
Ubuntu'da en son Git
sudo apt-get update
sudo apt-get install git
git --version
Bu işe yaramazsa (Ubuntu'nun çok eski bir sürümüne sahipsiniz),
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
Bu hala işe yaramazsa, deneyin
sudo chmod +x /usr/share/doc/git/contrib/subtree/git-subtree.sh
sudo ln -s \
/usr/share/doc/git/contrib/subtree/git-subtree.sh \
/usr/lib/git-core/git-subtree
Yorumlardan rui.araujo'ya teşekkürler.
Geçmişinizi temizleme
Varsayılan olarak dosyaları Git'ten kaldırmak aslında onları kaldırmaz, sadece artık orada olmadıklarını taahhüt eder. Geçmişteki referansları gerçekten kaldırmak istiyorsanız (yani bir şifre vermişseniz), bunu yapmanız gerekir:
git filter-branch --prune-empty --tree-filter 'rm -rf <name-of-folder>' HEAD
Bundan sonra dosya veya klasörünüzün Git geçmişinde artık görünüp görünmediğini kontrol edebilirsiniz.
git log -- <name-of-folder> # should show nothing
Ancak, silme işlemlerini GitHub ve benzerine "itemez" . Eğer denerseniz bir hata alırsınız vegit pull
önce yapmanızgit push
- ve sonra geçmişinizdeki her şeye geri dönersiniz.
Dolayısıyla, geçmişi "başlangıç noktasından" silmek istiyorsanız - GitHub, Bitbucket, vb. Öğesinden silmek anlamına gelir - repo'yu silmeniz ve repo'nun budanmış bir kopyasını yeniden itmeniz gerekir. Ama bekleyin - dahası var ! - Gerçekten bir parola veya benzeri bir şeyden kurtulmaktan endişe ediyorsanız, yedeklemeyi budamanız gerekir (aşağıya bakın).
Yapımı .git
küçük
Yukarıda belirtilen silme geçmişi komutu hala bir grup yedekleme dosyasının ardında kalıyor - çünkü Git yanlışlıkla deponuzu yanlışlıkla mahvetmemenize yardımcı olmak için çok nazik. Sonunda yetim olmayan dosyaları günler ve aylar içinde siler, ancak istemediğiniz bir şeyi yanlışlıkla sildiğinizi fark etmeniz durumunda bir süre orada bırakır.
Bu nedenle , bir repo'nun klon boyutunu hemen azaltmak için çöp kutusunu gerçekten boşaltmak istiyorsanız, tüm bu gerçekten garip şeyleri yapmanız gerekir:
rm -rf .git/refs/original/ && \
git reflog expire --all && \
git gc --aggressive --prune=now
git reflog expire --all --expire-unreachable=0
git repack -A -d
git prune
Bununla birlikte, yanlış alt dizini budamak durumunda olmanız gerektiğini bilmiyorsanız, bu adımları uygulamamanızı tavsiye ederim. Repoyu bastığınızda yedek dosyalar klonlanmamalıdır, sadece yerel kopyanızda olurlar.
Kredi
git filter-branch
benim cevabımı görmek ile bu önemsiz .