【问题标题】:Git: copy all files in a directory from another branchGit:从另一个分支复制目录中的所有文件
【发布时间】:2011-02-09 18:22:06
【问题描述】:

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

列出该目录中的所有文件
git ls-tree master:dirname

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

git checkout master -- dirname/filename

但是,到目前为止,使用通配符完全失败了。这无济于事:

git checkout master -- dirname/*.png

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

【问题讨论】:

    标签: git file copy branch


    【解决方案1】:

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

    git checkout master -- dirname
    

    【讨论】:

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

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

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

    【讨论】:

    • 很遗憾git不直接支持这个功能。就像 OP 一样,我原以为它会像 git checkout master -- *.c
    • 这个答案帮助我回答了“如何将给定模式的文件从另一个分支签出到我当前的工作分支?”
    【解决方案3】:

    复制目录而不跟踪它

    git restore --source master dirname
    

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 2021-08-31
      • 2014-10-09
      • 1970-01-01
      • 2013-08-15
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      相关资源
      最近更新 更多