wersja checkout git - * częściowa / ścieżka *? (tj. użyj pathspec z checkoutem git z konkretnego zatwierdzenia)

0

Aby pobrać dowolny plik z „częściową / ścieżką” w ścieżce + nazwa z HEAD:

git checkout *partial/path*

Aby pobierać pliki z określonych zatwierdzeń ( -- jest opcjonalny tutaj):

git checkout abcde -- full/path/to/my/file full/path/to/another/file

Przeciwnie, poniższe polecenie działa nie pliki kasowe pasujące do ścieżki w podanym zatwierdzeniu:

git checkout abcde -- *partial/path*

Zamiast tego powoduje error: pathspec '*partial/path*' did not match any file(s) known to git.

Moje pytanie brzmi: Czy możliwe jest użycie ścieżki do pobrania wielu plików przy użyciu pathspec z określonego zatwierdzenia?


Uwaga: Zdaję sobie z tego sprawę git checkout branch file jest prawdopodobnie zupełnie innym poleceniem git checkout pathspec (a także zupełnie inny niż git checkout branch ), co może wyjaśniać, dlaczego pathspec nie działa tutaj.

Uwaga: Następujący alias tylko częściowo rozwiązuje problem:

[alias] ccps = "!f() { git ls-files $2 | xargs -I {} git checkout $1 -- \"{}\"; }; f"

To się nie powiedzie, gdy jeden lub więcej plików zostało dodanych lub usuniętych pasujących do ścieżki między bieżącym zatwierdzeniem a zatwierdzeniem docelowym.


AKTUALIZACJA: Następujący alias (rodzaj) robi to, co chcę:

[alias] ccps = "!f() { git ls-tree -r --name-only $1 | grep $2 | xargs -I {} git checkout $1 -- {}; }; f"

Problemy z tym rozwiązaniem:

  • grep $2 nie jest tym samym co ścieżka ścieżki (nie będzie działać z . i .. i * ).
  • Jest raczej powolny (sekwencja zajęła ~ 5 sekund) git checkout Zwrócono 57 plików grep ).

Ale jednocześnie mam teraz dostęp do wyrażenia regularnego, co jest plusem.

Hau
źródło

Odpowiedzi:

0

Symbole wieloznaczne są zwykle rozszerzane przez twoje muszla przeciwko żywemu systemowi plików. Aby przekazać je bezpośrednio do Gita, albo uciekaj, albo cytuj ścieżkę, tzn. \*partial/path\* lub "*partial/path*". W ten sposób rozszerzenie zostanie wykonane przez samego gita i przez dane zatwierdzenie.

grawity
źródło
Nie sądzę, aby był to problem z rozszerzeniem powłoki. Bieganie echo * pomyślnie wywołuje ekspansję i drukuje wszystkie pliki w bieżącym katalogu. Ale bieganie echo *partial/path* nie pasuje do niczego, a więc drukuje *partial/path*, czego, jak sądzę, jest tym, co kończy się przekazaniem do git.
Hau
Próbowałem też git checkout abcde -- "*partial/path*", który wciąż daje error: pathspec '*partial/path*' did not match any file(s) known to git.
Hau
Myślałem, że to działa, z wyjątkiem dopasowywania niewłaściwych plików. Próbować ' * częściowe / ścieżka 'jeśli symbole wieloznaczne mają przecinać ukośniki; normalnie * pasuje tylko dokładnie do jednego poziomu, a nie do podkatalogów.
grawity
Nie ma problemu, przepraszam, nie było jasne, jaki jest problem z poleceniem. Właśnie zaktualizowałem pytanie kilka minut temu z wynikiem.
Hau