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

ale*_*nko 178 git branch copy file

如何从另一个分支复制目录中的所有文件?我可以列出该目录中的所有文件

git ls-tree master:dirname
Run Code Online (Sandbox Code Playgroud)

然后,我可以单独复制所有文件

git checkout master -- dirname/filename
Run Code Online (Sandbox Code Playgroud)

但是,到目前为止,使用通配符已经完全失败了.这没有任何作用:

git checkout master -- dirname/*.png
Run Code Online (Sandbox Code Playgroud)

虽然我想我可以使用bash脚本来做到这一点,但必须有一个更简单的方法,对吧?

CB *_*ley 261

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

git checkout master -- dirname
Run Code Online (Sandbox Code Playgroud)

  • 对于不熟悉 git 的人,在运行上面的答案时,您应该位于 *target* 分支中,(在这种情况下)它将把目录从 `master` 分支复制到您的目标。 (6认同)
  • 另一个副作用我认为如果当前分支有不在你要检出的分支中的附加文件(在给定的目标文件夹中),它基本上将它们合并在一起 - 也许这只是一个是祖先?我不完全确定条件,但如果分支A中有20个文件,分支B中有20个文件,并且只有10个文件具有相同的文件名,那么最终会有30个文件(至少在我的情况下,分支A是B分支的祖先 (3认同)
  • 如果我想保留复制的文件的提交消息怎么办? (2认同)
  • @totels,严格来说没有与文件关联的提交消息; 提交消息与提交对象本身相关联.这就是我猜你想要的:`git checkout master - dirname; git add dirname; git commit -c $ COMMIT_SHA1 --reset-author;`其中`$ COMMIT_SHA1`可能类似于`branch_a`,并且是具有所需提交消息的提交对象.我不知道如何以编程方式确定最近更改为`dirname`的提交 (2认同)

sim*_*leo 19

要复制目录而不跟踪它

git restore --source master dirname
Run Code Online (Sandbox Code Playgroud)

  • 它还根据源分支删除文件,而“git checkout”使这些文件保持不变(至少我可以使用 git 2.32 观察到这种行为) (2认同)

tes*_*t30 17

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

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
Run Code Online (Sandbox Code Playgroud)

  • 遗憾的是git不直接支持这个功能.完全像OP,我会认为它会像`git checkout master - *.c` (4认同)

Jac*_*bec 6

就我而言,从原始分支目录获取文件的最简单的解决方案是:

  • origin - 远程存储库别名(默认为origin)
  • 目录中包含所需文件的分支
  • sourceBranchDirPath - 所需目录的相对/绝对路径

文件

git checkout origin/sourceBranchName -- sourceBranchDirPath
Run Code Online (Sandbox Code Playgroud)

例子:

git checkout origin/validation_fix -- src/test/java/validation/
Run Code Online (Sandbox Code Playgroud)

结果是草稿模式下src/test/java/validation/相对路径中来自origin/validation_fix分支 的所有文件(未提交)