Bagaimana saya bisa membuat git log
hanya pertunjukan yang mengubah file selain yang saya tentukan?
Dengan git log
, saya dapat memfilter komit yang saya lihat untuk mereka yang menyentuh serangkaian jalur tertentu. Yang saya inginkan adalah membalikkan filter itu sehingga hanya melakukan jalur sentuh itu selain yang ditentukan yang akan dicantumkan.
Saya bisa mendapatkan apa yang saya inginkan
git log --format="%n/%n%H" --name-only | ~/filter-log.pl | git log --stdin --no-walk
dimana filter-log.pl
:
#!/usr/bin/perl
use strict;
use warnings;
$/ = "\n/\n";
<>;
while (<>) {
my ($commit, @files) = split /\n/, $_;
if (grep { $_ && $_ !~ m[^(/$|.etckeeper$|lvm/(archive|backup)/)] } @files) {
print "$commit\n";
}
}
kecuali saya ingin sesuatu yang lebih elegan dari itu.
Perhatikan bahwa saya tidak menanyakan cara membuat git mengabaikan file. File-file ini harus dilacak dan dijalankan. Hanya saja, seringkali, saya tidak tertarik untuk melihat mereka.
Pertanyaan terkait: Bagaimana membalikkan `git log --grep = <pattern>` atau Bagaimana menampilkan log git yang tidak cocok dengan pola Ini pertanyaan yang sama kecuali untuk pesan komit dan bukan jalur.
Diskusi forum tentang hal ini dari tahun 2008: Perihal: Mengecualikan file dari git-diff Ini tampak menjanjikan tetapi utas tampaknya telah mengering.
!f() { git log ... | path/to/filter-log.pl "$@" | git log --stdin --no-walk; f
, atau bahkan menggabungkan bagian pipa itu ke dalam skrip juga.find
untuk menyaring direktori yang komitnya tidak ingin saya lihat. Jika saya ingin mengabaikan entri log dari komitmen yang dibuat ke direktori tingkat akarSiteConfig
maka saya akan mengatakan:git log `find . -type d -mindepth 1 -maxdepth 1 ! -name *SiteConfig`
git log --oneline --format=%s -- . ":!sub"
akan bekerja (dengan sihir pathspec:(exclude)
dan bentuk singkatnya:!
)Jawaban:
Ini diimplementasikan sekarang (git 1.9 / 2.0, Q1 2014) dengan pengenalan pathspec magic
:(exclude)
dan bentuk singkatnya:!
di commit ef79b1f dan commit 1649612 , oleh Nguyễn Thái Ngọc Duy (pclouds
) , dokumentasi dapat ditemukan di sini .Anda sekarang dapat mencatat semuanya kecuali konten sub-folder:
Atau Anda dapat mengecualikan elemen tertentu dalam sub-folder itu
file tertentu:
file apa pun yang diberikan di dalam
sub
:Anda dapat membuat pengecualian itu tidak peka huruf besar kecil!
Seperti yang dicatat Kenny Evitt
Catatan: Git 2.13 (Q2 2017) akan menambahkan sinonim
^
ke!
Lihat commit 859b7f1 , commit 42ebeb9 (08 Feb 2017) oleh Linus Torvalds (
torvalds
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 015fba3 , 27 Feb 2017)Jadi tambahkan '
^
' sebagai alias alternatif untuk entri pathspec yang tidak termasuk.Perhatikan bahwa, sebelum Git 2.28 (Q3 2020), penggunaan pathspec negatif, saat mengumpulkan path termasuk yang tidak terlacak di pohon kerja, telah rusak.
Lihat commit f1f061e (05 Jun 2020) oleh Elijah Newren (
newren
) .(Digabung oleh Junio C Hamano -
gitster
- di commit 64efa11 , 18 Jun 2020)sumber
":(exclude)pathPattern1" ":(exclude)pathPattern2"
, sehingga mengabaikan banyak folder / file.':!sub'
untuk menghindaribash: ... event not found
kesalahan .":\!sub"
tidak bekerja.git help glossary
(yang saya temukan tercantum digit help -g
[yang saya temukan disarankan digit help
]).tl; dr:
shopt -s extglob && git log !(unwanted/glob|another/unwanted/glob)
Jika Anda menggunakan Bash, Anda seharusnya dapat menggunakan fitur globbing yang diperluas untuk hanya mendapatkan file yang Anda butuhkan:
Anda dapat menggabungkan ini dengan
globstar
untuk tindakan rekursif.sumber
Anda dapat mengabaikan sementara perubahan dalam file dengan:
Ke depan, semua perubahan ke file-file akan diabaikan oleh
git status
,git commit -a
, dll Bila Anda siap untuk melakukan file-file, hanya membalikkannya:dan berkomitmen seperti biasa.
sumber
git update-index --skip-worktree
tidak menyebabkangit log
penyaringan komit yang telah dibuat.