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

268

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

git ls-tree master:dirname

我可以通过执行以下操作逐个复制所有文件:

git checkout master -- dirname/filename

然而,到目前为止,使用通配符完全失败了。这样做什么也没用:

git checkout master -- dirname/*.png

虽然我猜我可以使用一个bash脚本来实现这个,但一定有更简单的方式,对吧?


你是想将dirname/filename从master移动到其它分支,还是想将其它分支的文件复制到master?我想要做类似的操作。我想要将branch1中的文件复制到branch2,而我现在处于branch2分支。我需要执行哪些步骤? - Femn Dharamshi
5个回答

410

由于您没有尝试在树中移动文件,因此应该可以直接检出目录:

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 的提交。 - Alexander Bird
5
我认为另一个副作用是,如果当前分支(在给定的目标文件夹中)有额外的文件不在你正在检出的分支中,它们将基本上合并在一起-也许只是当其中一个是祖先时?我不确定确切的条件,但如果在分支A中有20个文件,在分支B中有20个文件,并且只有10个文件名相同,那么你最终会得到30个文件(至少在我这种情况下,分支A是分支B的祖先)。 - codercake
1
据我所知,.gitignore文件在checkout过程中不使用。它的作用是告诉git需要关心哪些新文件。在git repo中拥有被“忽略”的文件是完全合法的,尽管在大多数情况下这并不是您想要的。看起来您已经将文件提交到了repo(master),然后稍后将该文件规范添加到.gitignore中。这只会告诉git应该忽略与被忽略的文件匹配的新文件。原始提交到repo的文件仍然存在。通常情况下,您应该删除已经提交的原始文件。 - Spiralis
4
对于不熟悉 Git 的人,当运行以上答案时,应该在目标分支上,这将从“主”分支复制目录到您的目标分支(在该示例中)。 - ffghfgh
显示剩余7条评论

20

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

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

4
很遗憾,Git并没有直接支持这个功能。就像原帖中所说,我会认为它应该是类似于git checkout master -- *.c的东西。 - Gregory Kuhn
1
这个答案帮助了我回答“如何从另一个分支检出给定模式的文件到我的当前工作分支?” - usr-local-ΕΨΗΕΛΩΝ

18

复制目录但不跟踪它:

git restore --source master dirname

2
它还可以根据源分支删除文件,而“git checkout”则不会触及这些文件(至少我在git 2.32中观察到了这种行为)。 - Dmitry

4
在我的情况下,从源分支目录获取文件的最简单解决方案是:
  • origin - 远程仓库别名(默认为origin) 源分支名称
  • branch - 包含所需文件的分支
  • sourceBranchDirPath - 相对/绝对路径到所需目录

文件

git checkout origin/sourceBranchName -- sourceBranchDirPath

例子:

git checkout origin/validation_fix -- src/test/java/validation/

结果是以草稿模式(未提交)为基础,按相对路径 src/test/java/validation/ ,从 origin/validation_fix 分支中获取所有文件。

1
git checkout sourceBranchName :

可以从源分支(sourceBranch)检出所有内容(根目录)到您的本地当前分支。

我已经亲自测试过了。谢谢!

-- Shizheng


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接