Git: skopiuj wszystkie pliki do katalogu z innego oddziału


189

Jak skopiować wszystkie pliki do katalogu z innego oddziału? Mogę wyświetlić listę wszystkich plików w tym katalogu

git ls-tree master:dirname

Następnie mogę skopiować wszystkie pliki indywidualnie

git checkout master -- dirname/filename

Jednak używanie symboli wieloznacznych do tej pory było całkowitą porażką. To nic nie robi:

git checkout master -- dirname/*.png

Chociaż wydaje mi się, że mogę do tego użyć skryptu bash, musi być prostszy sposób, prawda?

Odpowiedzi:


289

Ponieważ nie próbujesz przenosić plików w drzewie, powinieneś być w stanie po prostu pobrać katalog:

git checkout master -- dirname

2
Co jeśli chciałbym zachować komunikaty zatwierdzania dla skopiowanych plików?
totels

2
@totels, ściśle mówiąc, nie ma żadnych komunikatów zatwierdzających związanych z plikami; komunikat zatwierdzenia jest powiązany z samym obiektem zatwierdzenia. Oto, co myślę, że chcesz: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;gdzie $COMMIT_SHA1może być branch_ai byłby obiektem zatwierdzenia, który ma komunikat zatwierdzenia, który chcesz. Nie wiem od razu, jak programowo określić zatwierdzenie z ostatnią zmianą nadirname
Alexander Bird

1
Ma to bardzo dziwny efekt uboczny. Kopiuje dirnamepowyżej, ale także kopiuje wszystkie pliki, które znajdują się w .gitignorena mastergałęzi. Masz pomysł, dlaczego tak jest?
Milimetryczny

4
Kolejny efekt uboczny Myślę, że jeśli bieżąca gałąź ma dodatkowe pliki, które nie znajdują się w gałęzi, z której się pobierasz (w danym folderze docelowym), to po prostu scali je razem - może to tylko jeśli ktoś jest przodkiem? Nie jestem do końca pewien warunków, ale jeśli masz 20 plików w gałęzi A i 20 plików w gałęzi B, a tylko 10 z nich ma tę samą nazwę, to masz 30 plików (przynajmniej w moim przypadku, gdy gałąź A jest przodkiem oddziału B)
codercake

@totels sprawdź polecenie git cherry-pick. Stosuje zatwierdzenia z innych gałęzi, ale tylko pliki, które zostały zmienione w żądanych zatwierdzeniach.
cs01

18

Jeśli w ścieżkach nie ma spacji i jesteś zainteresowany, tak jak ja, tylko plikami o określonym rozszerzeniu, możesz użyć

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')

4
Szkoda, że ​​git nie obsługuje bezpośrednio tej funkcji. Dokładnie jak OP, pomyślałbym, że to będzie coś w stylugit checkout master -- *.c
Gregory Kuhn

1
Ta odpowiedź pomogła mi odpowiedzieć „Jak mogę pobrać pliki danego wzoru z innej gałęzi do mojej bieżącej działającej gałęzi?”
usr-local-ΕΨΗΕΛΩΝ
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.