Git: скопіюйте всі файли в каталог з іншої гілки


189

Як скопіювати всі файли в каталог з іншої гілки? Я можу зробити список усіх файлів у цьому каталозі, виконавши це

git ls-tree master:dirname

Потім я можу копіювати всі файли окремо, роблячи це

git checkout master -- dirname/filename

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

git checkout master -- dirname/*.png

Хоча я думаю, що я можу використовувати скрипт bash для цього, повинен бути простіший спосіб, правда?

Відповіді:


289

Оскільки ви не намагаєтеся переміщати файли навколо дерева, ви повинні мати можливість просто перевірити каталог:

git checkout master -- dirname

2
Що робити, якщо я хотів би зберегти повідомлення про фіксацію файлів, скопійованих заново?
totels

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 є родоначальником гілки В)
кодексуючий торт

@totels перевірити команду git cherry-pick. Він застосовує коміти з інших гілок, але тільки ті файли, які були змінені в комісіях, які ви хочете.
cs01

18

Якщо в шляхах немає пробілів, і ви зацікавлені, як і я, у файлах конкретного розширення, ви можете використовувати

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

4
Шкода, що git не підтримує цю функцію безпосередньо. Точно як ОП, я б подумав, що це буде щось на кшталтgit checkout master -- *.c
Григорій Кун

1
Ця відповідь допомогла мені відповісти "Як я можу перевірити файли заданого шаблону з іншої гілки до моєї поточної робочої гілки?"
usr-local-ΕΨΗΕΛΩΝ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.