SORU
9 EKİM 2010, CUMARTESİ


Nasıl bir Gıt geçmişte tamamlama yapabilirim?

Her şeyi kendi kişisel kullanım için Gıt çeviriyorum ve bir dosyanın eski sürümleri zaten depo içinde buldum. Nasıl doğru sipariş dosyanın "değiştirme tarihi dosya doğru bir geçmişi var"? göre tarih dök mı

Bu işe yarar gibi bir şey söylendi:

git filter-branch --env-filter="GIT_AUTHOR_DATE=... --index-filter "git commit path/to/file --date " --tag-name-filter cat -- --all  

CEVAP
10 EKİM 2010, Pazar


Sana verilen tavsiyeler kusurludur. Koşulsuz --env-filter GİT_AUTHOR_DATE ayar her tarihi yeniden yazmak taahhüt eder. Ayrıca, kullanmak için alışılmadık bir şey olurgit commit--index-filter içinde.

Birden çok, bağımsız sorunları ile burada ilgileniyor.

Belirterek Tarihler dışında “şimdi”

Taahhüt var her iki tarih yazar: tarih ve committer tarihi. Ortam değişkenleri GİT_AUTHOR_DATE aracılığıyla temin değerlere göre her bir geçersiz kılma ve yeni bir taahhüt yazan herhangi bir komut için GİT_COMMİTTER_DATE. “Date Formats” in git-commit(1) bakın ya da aşağıda

Git internal format = <unix timestamp> <time zone offset>, e.g.  1112926393  0200
RFC 2822            = e.g. Thu, 07 Apr 2005 22:13:13  0200
ISO 8601            = e.g. 2005-04-07T22:13:13

Yeni bir yazar, sadece bu komut, normal kullanım sırasında taahhütgit commit. Ayrıca, doğrudan yazar tarihi belirlemenize izin veren --date bir seçenek vardır. Senin beklenen kullanımını içerir git filter-branch --env-filter da kullandığı ortam değişkenleri yukarıda (bu bölüm “env” sonra hangi seçeneği olarak adlandırılır; “Options” in git-filter-branch(1) ve alttaki “tesisat” komutu git-commit-tree(1).

Bir Tek İçine bir Dosya eklemekrefTarih

Eğer depo çok basit (yani sadece tek bir dal yok, etiket yok) ise, o zaman muhtemelen kullanabilirsinizgit rebasebu işi yapmak için.

Aşağıdaki komutlar, taahhüt edilen nesnenin adı (SHA-1 karma) kullanmak yerine“. “Geçersiz kılma” çalıştırdığınızda yöntemleri . tarih birini kullanmayı unutmayın ^em>git commit.

---A---B---C---o---o---o   master

git checkout master
git checkout A~0
git add path/to/file
git commit --date='whenever'
git tag ,new-commit -m'delete me later'
git checkout -
git rebase --onto ,new-commit A
git tag -d ,new-commit

---A---N                      (was ",new-commit", but we delete the tag)
        \
         B'---C'---o---o---o   master

Eğer yeni bir dosya eklemek için Bir eklendi yeni oluşturmak yerine commit () güncelleme yapmak istersem, o zaman git commit yerine git commit --amend kullanın. Sonuçta bu gibi görünecektir:

---A'---B'---C'---o---o---o   master

Yukarıda yeni üst olması gereken işlemek işlemek adına mümkün olduğunca uzun süre çalışır. Eğer gerçekten eklenecek yeni dosya yeni bir kök üzerinden işlerse (anne), sonra da biraz farklı bir şey gerekir:

B---C---o---o---o   master

git checkout master
git checkout --orphan new-root
git rm -rf .
git add path/to/file
GIT_AUTHOR_DATE='whenever' git commit
git checkout -
git rebase --root --onto new-root
git branch -d new-root

N                       (was new-root, but we deleted it)
 \
  B'---C'---o---o---o   master

git checkout --orphan nispeten yeni (Gıt 1.7.2) ama Git eski sürümleri üzerinde çalışan other ways of doing the same thing vardır.

Bir ekleme bir Dosya ÇokrefTarih

Eğer deponuzu daha karmaşık (yani birden fazla hakem (dallar, vb. kategori)), o zaman muhtemelen kullanmak gerekirfiltre-dal git.Kullanmadan öncefiltre-dal gitbütün depoyu yedek bir kopyasını yapmak gerekir.Bir basittartüm çalışma ağaç arşivi (dahil olmak üzere .dizin gıt) yeterlidir.filtre-dal gityedek başvuruları yapar, ama çoğu zaman yedekten sadece .git dizin silme ve geri yüklemek pek de doğru bir filtreleme kurtarmak için daha kolaydır.

Not: alt düzey komut kullanımı aşağıdaki örnekleri git add yerine git update-index --add. Kullanabilirsinizgit ekleyinilk beklenen yol için bazı dış konumdan dosyayı kopyalamak gerekir , ama (--index-filter boş bir geçici GİT_WORK_TREE kendi komut çalışır).

Eğer varolan her taahhüt eklenecek yeni dosyanızı isterseniz, bunu yapabilirsiniz:

new_file=$(git hash-object -w path/to/file)
git filter-branch \
  --index-filter \
    'git update-index --add --cacheinfo 100644 '"$new_file"' path/to/file' \
  --tag-name-filter cat \
  -- --all
git reset --hard

Gerçekten --env-filter 'GIT_AUTHOR_DATE=…' ile mevcut iptalleri tarihlerini değiştirmek için bir neden görmüyorum. Eğer kullanıyorsanız, her tarihi yeniden yazmak taahhüt etmesi gerektiğini koşullu mutlu olurdu.

Eğer varolan bazı tamamlamak sonra işleyen tek görünmesini yeni dosyanızı isterseniz (“”), o zaman bunu yapabilirsiniz:

file_path=path/to/file
before_commit=$(git rev-parse --verify A)
file_blob=$(git hash-object -w "$file_path")
git filter-branch \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$before_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

Eğer dosya eklenecek yeni bir commit geçmişi ortasına aracılığı ile ilave olmak istiyorsanız, o zaman kullanmadan önce tamamlama yeni oluşturmak gerekirfiltre-dal gitve Ekle 27* *içinfiltre-dal git:

file_path=path/to/file
before_commit=$(git rev-parse --verify A)

git checkout master
git checkout "$before_commit"
git add "$file_path"
git commit --date='whenever'
new_commit=$(git rev-parse --verify HEAD)
file_blob=$(git rev-parse --verify HEAD:"$file_path")
git checkout -

git filter-branch \
  --parent-filter "sed -e s/$before_commit/$new_commit/g" \
  --index-filter '

    if x=$(git rev-list -1 "$GIT_COMMIT" --not '"$new_commit"') &&
       test -n "$x"; then
         git update-index --add --cacheinfo 100644 '"$file_blob $file_path"'
    fi

  ' \
  --tag-name-filter cat \
  -- --all
git reset --hard

Ayrıca dosya ilk olarak yeni bir kök eklenecek gelmesini sağlayabilir misin tamamlama: yeni kök“. yöntem yetim aracılığıyla taahhüt oluşturun ^em>git rebasebölüm (new_commit bunu Çek), koşulsuz kullanın --index-filter * * * "sed -e \"s/^$/-p $new_commit/\"" --parent-filter.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • bigky226

    bigky226

    11 HAZİRAN 2006
  • Fubar Protocol

    Fubar Protoc

    21 AĞUSTOS 2010
  • InfinityWard

    InfinityWard

    19 EYLÜL 2006