SORU
20 Ocak 2010, ÇARŞAMBA


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
28 Ocak 2010, PERŞEMBE


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 bulunur oops.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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Major FX

    Major FX

    6 HAZİRAN 2012
  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • TechRax

    TechRax

    21 EYLÜL 2009