Zauważ, że nie byłbyś potrzebny, ponieważ Git 2.5 (Q2 2015) a ' --
', jeśli twój argument zawiera znak wieloznaczny ( *
)
Heurystyką, która pomaga git <cmd> <revs> <pathspec>
konwencji wiersza poleceń w przechwytywaniu źle wpisanych ścieżek, jest upewnienie się, że wszystkie parametry non-rev w dalszej części wiersza poleceń to nazwy plików w działającym drzewie, ale to oznacza, że git grep $str -- \*.c
zawsze musi być „ ” niejednoznaczny z „ --
”, ponieważ nikt rozsądny nie utworzy pliku, którego nazwa dosłownie brzmi gwiazdka-kropka-zobacz.
Git 2.5 traci heurystykę, aby zadeklarować, że za pomocą łańcucha wieloznacznego użytkownik prawdopodobnie chciałby podać nam ścieżkę .
git checkout 'a*'
# same as
git checkout -- 'a*'
Zobacz commit 28fcc0b (02 maja 2015) autorstwa Duy Nguyen ( nguyenlocduy
) .
(Połączone przez Junio C Hamano - gitster
- w commit 949d167 , 19 maja 2015)
pathspec
: unikaj potrzeby używania „ --
”, gdy używany jest symbol wieloznaczny
Gdy --
brakuje wiersza „ ” z wiersza poleceń, a polecenie może pobierać zarówno obroty, jak i ścieżki, chodzi o to, że jeśli argument może być postrzegany zarówno jako rozszerzony SHA-1, jak i ścieżka, wówczas --
wymagane jest „ ” lub git odmawia kontynuowania.
Obecnie jest wdrażany jako:
- (1) jeśli argumentem jest rev, to nie może istnieć w drzewie roboczym
- (2) w przeciwnym razie musi istnieć w drzewie roboczym
- (3) w przeciwnym
--
razie wymagane jest „ ”.
Reguły te działają w przypadku ścieżek dosłownych, ale gdy w grę wchodzi niematerialna specyfikacja ścieżki, prawie zawsze wymaga dodania przez użytkownika „ --
”, ponieważ zawodzi (2) i (1) jest naprawdę rzadko spotykane (weź „ *.c
”, na przykład (1) jest spełnione, jeśli istnieje odwołanie o nazwie „ *.c
”).
Ta poprawka nieco modyfikuje reguły, biorąc pod uwagę, że dowolny prawidłowy ( *
) symbol ścieżki zastępczej „istnieje w drzewie roboczym”.
Reguły stają się:
- (1) jeśli arg jest wersją, to musi albo istnieć w drzewie roboczym, albo nie może być poprawnym typem ścieżki wieloznacznej.
- (2) w przeciwnym razie istnieje on w drzewie roboczym lub jest ścieżką określającą symbol wieloznaczny
- (3) w przeciwnym
--
razie wymagane jest „ ”.
Dzięki nowym regułom „ --
” nie jest potrzebne przez większość czasu, gdy w grę wchodzi ścieżka wieloznaczna.
W Git 2.26 (Q1 2020) logika ujednoznacznienia odróżniająca wersje i rozróżnienie ścieżek została zmieniona, tak aby globalne znaki specjalne, które uniknęły odwrotnego ukośnika, nie były uwzględniane w regule „symbole wieloznaczne są ścieżkami”.
Zobacz zatwierdzenie 39e21c6 (25 stycznia 2020 r.) Przez Jeff King ( peff
) .
(Połączone przez Junio C Hamano - gitster
- w commit 341f8a6 , 12 lutego 2020)
verify_filename()
: obsłużyć ukośniki odwrotne w regule „symbole wieloznaczne są ścieżkami”
Zgłoszony przez: David Burström
Podpisany przez: Jeff King
Zatwierdź 28fcc0b71a ( pathspec
: unikaj potrzeby używania „ --
”, gdy używana jest symbol wieloznaczny, 02.05.2015) dozwolone:
git rev-parse '*.c'
bez podwójnej kreski.
Ale reguła, której używa do sprawdzania symboli wieloznacznych, faktycznie szuka jakiejś specjalnej oferty globalnej.
Jest to zbyt liberalne, ponieważ oznacza, że wzorzec, który w rzeczywistości nie dopasowuje symboli wieloznacznych, taki jak „ a\b
”, będzie uważany za rodzaj ścieżki.
Jeśli masz taki plik na dysku, prawdopodobnie tego właśnie chciałeś.
Ale jeśli tego nie zrobisz, wyniki są mylące: zamiast powiedzieć „ there's no such path a\b
”, spokojnie zaakceptujemy go jako ścieżkę, która najprawdopodobniej nie pasuje do niczego (a przynajmniej nie do tego, co zamierzałeś).
Podobnie szukanie ścieżki „ a\*b
” wcale nie rozszerza wyszukiwania; znalazłby tylko jeden wpis „ a*b
”.
To zatwierdzenie przełącza regułę tak, aby wyzwalała się tylko wtedy, gdy globalne metaznaki rozszerzyłyby wyszukiwanie, co oznacza, że oba te przypadki będą teraz zgłaszać błąd (nadal możesz jednoznacznie za pomocą „ --
”, oczywiście; po prostu zaostrzamy heurystykę DWIM).
( DWIM: Rób, co mam na myśli )
Pamiętaj, że w ogóle nie testowaliśmy oryginalnej funkcji w 28fcc0b71a .
Ta poprawka nie tylko testuje te narożne przypadki, ale także dodaje test regresji dla istniejącego zachowania.