Git: скопировать все файлы в каталоге из другой ветки

189

Как мне скопировать все файлы в каталоге из другой ветки? Я могу перечислить все файлы в этом каталоге, выполнив

git ls-tree master:dirname

Затем я могу скопировать все файлы по отдельности, выполнив

git checkout master -- dirname/filename

Однако использование групповых символов до сих пор было полным провалом. Это ничего не делает:

git checkout master -- dirname/*.png

Хотя я полагаю, что для этого можно использовать скрипт bash, должен быть более простой способ, верно?

Алексенко
источник

Ответы:

289

Поскольку вы не пытаетесь перемещать файлы в дереве, вы можете просто извлечь каталог:

git checkout master -- dirname
CB Bailey
источник
2
Что если я захочу сохранить сообщения о коммитах для скопированных файлов?
Тотелс
2
@totels, строго говоря, нет никаких сообщений коммита, связанных с файлами; сообщение фиксации связано с самим объектом фиксации. Это то, что, я думаю, вы хотите: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;где $COMMIT_SHA1может быть branch_aи будет коммит, у которого есть нужное вам сообщение коммита. Я не знаю, как вручную определить, как зафиксировать коммит с последним изменениемdirname
Александр Берд
1
Это имеет очень странный побочный эффект. Он копирует dirnameболее, но он также копирует любые файлы , которые находятся в .gitignoreв masterотрасли. Есть идеи, почему это так?
Милиметрический
4
Другой побочный эффект, я думаю, что если в текущей ветке есть дополнительные файлы, не входящие в ту ветку, из которой вы извлекаете (в заданной целевой папке), она в основном объединит их вместе - возможно, это просто, если один из них является предком? Я не совсем уверен в условиях, но если у вас есть 20 файлов в ветви A и 20 файлов в ветви B, и только 10 из них имеют одинаковое имя файла, вы получите 30 файлов (по крайней мере, в моем случае, когда ветвь A является предком ветви B)
codercake
@totels проверьте команду git cherry-pick. Он применяет коммиты из других веток, но только те файлы, которые были изменены в коммитах, которые вы хотите.
cs01
18

Если в путях нет пробелов и вас, как и меня, интересуют только файлы определенного расширения, вы можете использовать

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
test30
источник
4
Жаль, что git не поддерживает эту функцию напрямую. Точно так же, как ОП, я бы подумал, что это будет что-то вродеgit checkout master -- *.c
Грегори Кун
1
Этот ответ помог мне ответить «Как я могу извлечь файлы данного шаблона из другой ветви в мою текущую рабочую ветку?»
usr-local-ΕΨΗΕΛΩΝ