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

use*_*790 8 git

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

回购A.

file.xlf
file.txt
level2/
    file2.xlf
    file2.txt
    level3/
        file3.xlf
        file3.txt 
Run Code Online (Sandbox Code Playgroud)

结帐后回购B看起来像:

回购B.

file.xlf
    /level2
    file2.xlf
        /level3
        file3.xlf
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

$ git checkout FETCH_HEAD -- '*.xlf'
Run Code Online (Sandbox Code Playgroud)

这将提供".xlf"根级别的所有文件,但不会递归到子目录.

感谢您的帮助.

Dad*_*ane 16

你不需要find或sed,你可以使用通配符,因为git理解它们(不依赖于你的shell):

git checkout -- "*.xml"
Run Code Online (Sandbox Code Playgroud)

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

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

set -f
git checkout -- *.xml
Run Code Online (Sandbox Code Playgroud)

当然,这将无可挽回地抹去你的变化!

  • @aoetalks 对我来说它是递归的。但是只有 `git checkout -- "*.xml"` 版本(从索引中检出)`git checkout HEAD -- "*.xml"`(从分支名称检出)看起来不能递归地工作。 (3认同)

edu*_*udi 8

更新:检查Dadaso的答案,找出适用于大多数情况的解决方案.

您可以尝试这样的事情,使用git ls-treegrep:

git checkout origin/master -- `git ls-tree origin/master -r --name-only | grep ".xlf"`
Run Code Online (Sandbox Code Playgroud)

请注意,这需要一个远程originmaster分支.您还必须提供正确的过滤器/扩展名grep.

在执行此命令之前,您应该执行以下操作:

git init
git remote add origin <project.git>
git fetch
Run Code Online (Sandbox Code Playgroud)