Bunu yapmanın bir yolu tersidir - saklamak istediğiniz dosya dışındaki her şeyi kaldırın.
Temel olarak, deponun bir kopyasını oluşturun, ardından git filter-branch
saklamak istediğiniz dosya / klasörler dışındaki her şeyi kaldırmak için kullanın .
Örneğin, dosyayı tvnamer.py
yeni bir depoya çıkarmak istediğim bir projem var :
git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD
Bu, git filter-branch --tree-filter
her kaydetme işleminden geçmek, komutu çalıştırmak ve ortaya çıkan dizin içeriğini yeniden teslim etmek için kullanılır. Bu son derece yıkıcıdır (bu nedenle bunu yalnızca deponuzun bir kopyasında yapmalısınız!) Ve biraz zaman alabilir (300 kaydetme ve yaklaşık 20 dosya içeren bir havuzda yaklaşık 1 dakika)
Yukarıdaki komut, elbette değiştirmeniz gereken her revizyonda aşağıdaki kabuk komut dosyasını çalıştırır (bunun yerine alt dizininizi hariç tutmak için tvnamer.py
):
for f in *; do
if [ $f != "tvnamer.py" ]; then
rm -rf $f;
fi;
done
En bariz sorun, kalan dosyayla ilgisiz olsalar bile tüm commit mesajlarını bırakmasıdır. Git-remove-empty-commits betiği bunu düzeltir ..
git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
Herhangi bir şeyle tekrar -f
çalıştırılan force argümanını kullanmanız gerekir (temelde bir yedek)filter-branch
refs/original/
Elbette bu asla mükemmel olmayacak, örneğin commit mesajlarınız başka dosyalardan bahsediyorsa, ancak git akımının izin verdiği kadar yakın (her halükarda bildiğim kadarıyla).
Yine, bunu yalnızca deponuzun bir kopyasında çalıştırın! - ama özet olarak, "thisismyfilename.txt" dışındaki tüm dosyaları kaldırmak için:
git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'