有没有办法只对某些文件类型(.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'
个文件,但不会递归到子目录。
感谢您的帮助。
答案 0 :(得分:12)
您不需要查找或sed,您可以使用通配符,因为git了解它们(不依赖于您的shell):
git checkout -- "*.xml"
引号会阻止shell在执行命令之前将命令扩展到当前目录中的文件。
您还可以禁用shell glob扩展(使用bash):
set -f
git checkout -- *.xml
这当然会无可挽回地抹掉你的变化!
答案 1 :(得分:6)
更新:检查Dadaso's answer以获取适用于大多数情况的解决方案。
您可以使用git ls-tree
和grep
:
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)
我在提供的解决方案上遇到了麻烦,这是我的解决方案
git checkout branch -- ./
签出所有更改git add \*.type
git commit
git reset --hard
答案 5 :(得分:-1)
没有; git在整个存储库(和整个历史记录)级别运行;没有办法部分检查存储库。您当然可以检查存储库,然后删除与您的文件不匹配的所有内容,但当然这样做几乎没有任何结果。