git checkout只有整个项目的某些文件类型

时间:2015-07-07 10:10:42

标签: git

有没有办法只对某些文件类型(.xlf)执行git checkout,它会在整个存储库中递归?结果应包含存储库的结构,即文件夹和特定扩展名的包含文件。

回购A

ffmpeg

结账时,回购B看起来像:

回购B

file.xlf
file.txt
level2/
    file2.xlf
    file2.txt
    level3/
        file3.xlf
        file3.txt 

这是我到目前为止所做的:

file.xlf
    /level2
    file2.xlf
        /level3
        file3.xlf

这会在根级别提供所有$ git checkout FETCH_HEAD -- '*.xlf' 个文件,但不会递归到子目录。

感谢您的帮助。

6 个答案:

答案 0 :(得分:12)

您不需要查找或sed,您可以使用通配符,因为git了解它们(不依赖于您的shell):

git checkout -- "*.xml"

引号会阻止shell在执行命令之前将命令扩展到当前目录中的文件。

您还可以禁用shell glob扩展(使用bash):

set -f
git checkout -- *.xml

这当然会无可挽回地抹掉你的变化!

答案 1 :(得分:6)

更新:检查Dadaso's answer以获取适用于大多数情况的解决方案。

您可以使用git ls-treegrep

尝试这样的操作
git checkout origin/master -- `git ls-tree origin/master -r --name-only | grep ".xlf"`

请注意,这需要origin分支中的远程master。您还必须为grep提供正确的过滤器/扩展程序。

  

在此命令之前,你应该做这样的事情:

git init
git remote add origin <project.git>
git fetch

答案 2 :(得分:1)

在PowerShell(Windows,尚未尝试使用PowerShell Core + Linux)上,我能够做到这一点

git ls-tree master -r --name-only | sls ".cscfg" | foreach { git checkout origin/master -- $_ }

答案 3 :(得分:1)

Dadaso的答案git checkout -- "*.xml"从索引到工作目录递归检出所有.xml文件。

但是由于某些原因,git checkout branch-name -- "*.xml"(从branch-name分支中检出文件)无法递归工作,并且仅检查根目录中的“ xml”文件。

因此,IMO最好是使用git ls-tree,然后过滤您感兴趣的文件名并将其传递给git checkout branch-name --。这是您可以使用的命令:

  • Bash(在Windows上为git bash)版本:

    git ls-tree branch-name --full-tree --name-only -r | grep "\.xml" | xargs git checkout branch-name --
    
  • cmd(windows)版本(如果您的PATH中没有“ C:\ Program Files \ Git \ usr \ bin”):

    git ls-tree branch-name --full-tree --name-only -r | "C:\Program Files\Git\usr\bin\grep.exe" "\.xml" | "C:\Program Files\Git\usr\bin\xargs.exe" git checkout branch-name --
    
  • 对于powershell来说,最好叫cmd.exe,因为它速度更快(powershell对本机stdin / stdout流水线没有很好的支持):

    cmd.exe /C 'git ls-tree branch-name --full-tree --name-only -r | "C:\Program Files\Git\usr\bin\grep.exe" "\.xml" | "C:\Program Files\Git\usr\bin\xargs.exe" git checkout branch-name --'
    
  • 但是,您的文件数量很少,可以在powershell中尝试此操作(例如@aoetalks答案)。但是我发现对于一些猎犬文件来说,它非常慢:

    git ls-tree branch-name --full-tree --name-only -r | sls "\.xml" | %{ git checkout branch-name -- $_ }
    

答案 4 :(得分:0)

我在提供的解决方案上遇到了麻烦,这是我的解决方案

  1. 从另一个分支git checkout branch -- ./签出所有更改
  2. 仅暂存特定类型的git add \*.type
  3. 提交暂存文件git commit
  4. 重置其他文件git reset --hard

答案 5 :(得分:-1)

没有; git在整个存储库(和整个历史记录)级别运行;没有办法部分检查存储库。您当然可以检查存储库,然后删除与您的文件不匹配的所有内容,但当然这样做几乎没有任何结果。