2015-02-04 23 views
10

Az önce bir projeyi Mercurial'dan Git'e taşıdım. Mercurial, etiket eklediğinizde boş öğeler ekler. Bu yüzden, Git'te kaldırmak istediğim boş öğelerle sona erdim.Git boş bırakma işlemlerini kaldır

Git'ten herhangi bir dosya içermeyen boş öğeleri nasıl kaldırabilirim?

Teşekkürler.

cevap

13

Bunu yapmak için basit (ancak yavaş) bir yol, git filter-branch ve --prune-empty. Başka hiçbir filtre kullanılmadığında, başka hiçbir işlem değiştirilmeyecek, ancak boş olanlar silinecektir (bu, sonraki tüm işlemlerin yeni üst kimliklere sahip olmasına ve dolayısıyla da "geçmişi yeniden yazmasına" neden olacaktır. hg'den git öğesine aktar, ancak diğerleri zaten bu depoyu kullanıyorsa çok önemli bir şeydir).

Filtre dallı tüm olağan uyarılara dikkat edin. (Ayrıca, bir yan not olarak, bir "boş taahhüt" aslında önceki işlemle aynı ağacın olduğu bir şeydir: hiç bir dosyaya sahip olmaması değil, aynı modda, aynı modlara sahip olması, ve, üst taahhüt olarak. Bu her git mağazaları komple anlık değil birinden farklılıklar sonraki taahhüt, taahhüt çünkü aynı içeriği budur.) İşte


yerlerde bir sürü gizler küçük bir örnektir sen meraklısı şeyler yapabilir:

$ ... create repository ... 
$ cd some-tmp-dir; git clone --mirror file://path-to-original 

(Bu ilk klon adım güvenliği içindir: bu yeni bir klon r üzerinde başlatmak için her zaman iyidir, böylece filter-branch oldukça yıkıcı olabilir orijinalinden farklıdır. --mirror de bu kopyada yansıtılır tüm dalları ve etiketleri demektir kullanma)

$ git filter-branch --prune-empty --tag-name-filter cat -- --all 

(Şimdi bir potansiyel olarak çok uzun süre beklemek;. Yöntemlerine belgelere bakın yukarı biraz bu hızlandırmak için)

$ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 
.

(Bu adım, belgelerin dışına kopyalanır: filtreyi çalıştırmadan önce tüm orijinal dalları atar. Başka bir deyişle, filtrelemeyi kalıcı hale getirir. Bu bir klon olduğundan, filtre gittiyse bile mantıklı bir şekilde güvenlidir. yanlış.)

$ cd third-tmp-dir; git clone --mirror file://path-to-filtered-tmp 

(Bu filtreleme adımlar hiçbir artık nesnelerle, süzülmüş kopyanın temiz, güzel sıkıştırılmış kopyasını yapar.)

$ git log  # and other commands to inspect 

filtrelenmiş klonun klonu iyi olduğundan emin olduktan sonra, size Filtrelenmiş klona gerek yoktur ve ilk klonu ilk klonun yerine kullanabilir. (Yani, nihai klon ile "gerçek orijinal" yerini alabilir.)

+0

Nasıl kullanacağına dair bir örnek gösterebilir misin?İstek hakkında özür dilerim ama git – Greeso

+0

Thaks için yeniyim, beni kurtardın. Şimdi üzerinde çalışacak. – Greeso

İlgili konular