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
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
.
Nasıl vim normal (bash gibi) dosya isi...
Nasıl son tamamlama Geri Al mı?...
Nasıl web tarayıcı otomatik tamamlama ...
Nasıl Gıt (chmod) dosya mod değişiklik...
Nasıl gıt tamamlama belirtilen değişti...