Nasıl Git deposu tarih commit/kaldırmak için büyük bir dosya silmek?
Bazen DVD-rip web sitesi projeleri için bıraktım, sonra dikkatsizce* *12, ve, zap, repo 2.2 konser tarafından şişirilmiş. Bir dahaki sefere bazı düzenlemeler yaptım, video dosyası silinmiş, ve her şeyi yaptı, ama sıkıştırılmış dosya hala orada tarihin deposunda.
Bu ve başka üzerine bir şube tamamlar rebase dallarını başlayabilirim biliyorum. Ama ben büyük dosya geçmişi yoktu ve çöp toplama prosedürü temizledik, böylece 2 iptalleri birleştirmek için ne yapmalıyım?
CEVAP
Yapmak istediğiniz ne varsa diğer geliştiriciler için yayınlanan tarihi varsa son derece yıkıcı olur. Geçmişi tamir sonra gerekli adımları “Recovering From Upstream Rebase” in the git rebase
documentation bkz.
En az iki seçeneğiniz vardır: git filter-branch
ve interaktif rebase, her ikisi de aşağıda açıklanmıştır.
git filter-branch
kullanarak
Subversion almak hantal ikili test verileri ile benzer bir sorunum vardı ve removing data from a git repository hakkında yazdı.
Demek tarih oldu senin git:
$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A login.html
* cb14efd Remove DVD-rip
| D oops.iso
* ce36c98 Careless
| A oops.iso
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
git lola
standart olmayan ama son derece yararlı bir takma ad olduğunu unutmayın. --name-status
anahtarı ile, ağaç değişiklikler her biri ile ilişkili taahhüt görebiliriz.
” Ce36c98 olan () dosya oops.iso
DVD-rip kaza tarafından eklendi ve kaldırılır işlemek işlemek, cb14efd. “Dikkatsiz içinde Tekniği söz konusu blog yazısı anlatılan kullanarak, çalıştırılacak komut:
git filter-branch --prune-empty -d /dev/shm/scratch \
--index-filter "git rm --cached -f --ignore-unmatch oops.iso" \
--tag-name-filter cat -- --all
Seçenekler:
--prune-empty
boş haline tamamlar kaldırır (yani, ağaç değiştirmek değil) filtre işlemi sonucunda. Normal durumda, bu seçenek temiz bir geçmişi üretir.-d
henüz var olmayan geçici bir dizin süzülmüş tarihi bina için kullanılacak isim. Eğer modern bir Linux dağıtımı üzerinde çalıştırıyorsanız, tree in/dev/shm
will result in faster execution belirtme.--index-filter
ana olay ve tarihte her adımda dizin karşı çalışır. Her yerde bulunuroops.iso
kaldırmak istediğiniz, ancak mevcut değildir tamamlar. 25* *komutu mevcutsa DVD-rip siler ve aksi takdirde başarısız değil.--tag-name-filter
etiket adlarını yeniden açıklamaktadır.cat
bir filtre kimlik işlemdir. Deponuzu, örnek yukarıdaki gibi, herhangi bir etiket olabilir, ama tam genellik için bu seçeneği ekledim.--
git filter-branch
için seçenekler belirtir--
aşağıdaki--all
tüm başvuruları için kısaltma. Deponuzu, örnek yukarıdaki gibi, tek bir hakem (ana) olabilir, ama tam genellik için bu seçeneği ekledim.
Bazı çalkalama sonunda, geçmiş artık
$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A login.html
* e45ac59 Careless
| A other.html
| * f772d66 (refs/original/refs/heads/master) Login page
| | A login.html
| * cb14efd Remove DVD-rip
| | D oops.iso
| * ce36c98 Careless
|/
| A oops.iso
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
Yeni “kaydetme other.html
ve bu sadece” DVD-rip “kayıt ana şube. artık Kaldır ekler” Dikkatsiz dikkat edin Şubesi refs/original/refs/heads/master
bir hata yaptın diye, orijinal taahhüt içeren etiketli. Bunu kaldırmak için, “Checklist for Shrinking a Repository.” adımlarını takip edin
$ git update-ref -d refs/original/refs/heads/master
$ git reflog expire --expire=now --all
$ git gc --prune=now
Daha basit bir alternatif için, depo istenmeyen bit atmak için klon.
$ cd ~/src
$ mv repo repo.old
$ git clone file:///home/user/src/repo.old repo
file:///...
klon bir URL kullanarak hardlinks sadece oluşturmak yerine nesneleri kopyalar.
Artık geçmişini
$ git lola --name-status
* 8e0a11c (HEAD, master) Login page
| A login.html
* e45ac59 Careless
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
İlk iki iptalleri için SHA1 nesne adları (“”ve süzme işlemi bu teslimleri değiştirmedi. çünkü “Admin sayfası”) aynı kaldı Endeksi “Dikkatsiz” oops.iso
kayıp ve sayfa” yeni bir ebeveyn var, onların SHA1s. “Giriş ^em>yaptıdeğiştirin.
İnteraktif rebase
Bir geçmişi olan:
$ git lola --name-status
* f772d66 (HEAD, master) Login page
| A login.html
* cb14efd Remove DVD-rip
| D oops.iso
* ce36c98 Careless
| A oops.iso
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
sen hiç ekledi rağmen“, ve sonra” DVD-rip Kaldırmak için işe yaramaz. “Dikkatsiz oops.iso
kaldırmak istediğiniz Böylece, plan interaktif rebase girecek” “ve” DVD-rip Kaldır. “at” Dikkatsiz, Düzenle “Admin sayfası tutmaktır
$ git rebase -i 5af4522
çalışmaya başlamadan aşağıdaki içeriğe sahip bir editör.
pick ce36c98 Careless
pick cb14efd Remove DVD-rip
pick f772d66 Login page
# Rebase 5af4522..f772d66 onto 5af4522
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Bizim plan yürütülüyor, bunu değiştirin
edit ce36c98 Careless
pick f772d66 Login page
# Rebase 5af4522..f772d66 onto 5af4522
# ...
O, “-DVD rip” ve “pick
yerine. edit
” Dikkatsiz işlem değişikliği ile satır silinir.
Kaydet-bırakma editörü komut aşağıdaki ileti isteminde bize düşer.
Stopped at ce36c98... Careless
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
Mesaj bize söylediği gibi, biz “Dikkatsiz” düzenlemek istiyoruz, iki komutları çalıştırmak için commit.
$ git rm --cached oops.iso
$ git commit --amend -C HEAD
$ git rebase --continue
İlk soruna neden olan dizinden dosya kaldırır. İkinci değiştirir ya da” güncel endeks ve 49* *eski yeniden gıt teslim mesajı bildirir. “Dikkatsiz özür Son olarak, git rebase --continue
önde rebase işlemi geri kalanı ile gider.
Bu bir tarih verir:
$ git lola --name-status
* 93174be (HEAD, master) Login page
| A login.html
* a570198 Careless
| A other.html
* 5af4522 Admin page
| A admin.html
* e738b63 Index
A index.html
siz de bunu istiyorum.
Nasıl tam ve git deposu init ile oluşt...
Nasıl dosya oluşturma ve Tarih değişik...
Nasıl bir dizindeki tüm dosya ve klasö...
Nasıl bir yol ve dosya adları geçersiz...
Nasıl Git deposu, birden fazla silinmi...