Git:从另一个分支复制目录中的所有文件


188

如何从另一个分支复制目录中的所有文件?我可以通过执行以下操作列出该目录中的所有文件

git ls-tree master:dirname

然后,我可以通过执行以下操作分别复制所有文件

git checkout master -- dirname/filename

但是,到目前为止,使用通配符是完全失败的。这什么都不做:

git checkout master -- dirname/*.png

尽管我想我可以使用bash脚本来执行此操作,但必须有一种更简单的方法,对吗?

Answers:


289

由于您不打算在树中移动文件,因此您应该能够仅检出目录:

git checkout master -- dirname

2
如果我想保留复制的文件的提交消息怎么办?
旅馆

2
@totels,严格来说,没有与文件关联的提交消息;提交消息与提交对象本身关联。这是我猜你想:git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;哪里$COMMIT_SHA1可以像branch_a并会提交其具有提交你想要的消息对象。我不知道如何用最新的更改以编程方式确定提交dirname
Alexander Bird

1
这有一个很奇怪的副作用。它会复制dirname,但也会复制.gitignoremaster分支中的所有文件。知道为什么吗?
Milimetric

4
我认为另一个副作用是,如果当前分支在要签出的分支中没有其他文件(在给定的目标文件夹中),它将基本上将它们合并在一起-也许这仅仅是一个祖先?我不确定情况,但如果分支A中有20个文件,分支B中有20个文件,而其中只有10个文件具有相同的文件名,则最终会得到30个文件(至少在我的情况下,分支A是分支B的祖先)
codercake

@totels签出git命令cherry-pick。它应用来自其他分支的提交,但是仅应用所需的提交中已更改的文件。
cs01

18

如果路径中没有空格,并且您和我一样对仅特定扩展名的文件感兴趣,则可以使用

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

4
遗憾的是git不直接支持此功能。就像OP一样,我会以为它像git checkout master -- *.c
Gregory Kuhn

1
此答案帮助我回答“如何从另一个分支中检出给定模式的文件到我当前的工作分支中?”
USR-本地ΕΨΗΕΛΩΝ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.