2010-04-19 4 views
117

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

git ls-tree master:dirname 

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

git checkout master -- dirname/filename 

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

git checkout master -- dirname/*.png 

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

ответ

167

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

git checkout master -- dirname 
+0

Как насчет того, хочу ли я сохранить сообщения фиксации для скопированных файлов? – totels

+2

@totels, строго говоря, нет сообщений о фиксации, связанных с файлами; сообщение фиксации связано с самим объектом commit. Это то, что я предполагаю, что вы хотите: 'git checkout master - dirname; git add dirname; git commit -c $ COMMIT_SHA1 --reset-author; 'где' $ COMMIT_SHA1' может быть как 'branch_a' и будет объектом commit, который имеет сообщение фиксации, которое вы хотите. Я не знаю, как программно определить фиксацию с последним изменением на 'dirname' –

+1

Это имеет очень странный побочный эффект. Он копирует 'dirname' поверх, но также копирует все файлы, находящиеся в' .gitignore' ветви 'master'. Любая идея, почему это так? – Milimetric

12

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

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

Жаль, что git не поддерживает эту функцию напрямую. Точно как OP, я бы подумал, что это будет что-то вроде 'git checkout master - * .c' –

Смежные вопросы