git checkout 仅用于整个项目的某些文件类型

Posted

技术标签:

【中文标题】git checkout 仅用于整个项目的某些文件类型【英文标题】:git checkout only certain file types for entire project 【发布时间】:2015-09-24 18:29:36 【问题描述】:

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

回购 A

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

结帐后回购 B 看起来像:

回购 B

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

这是我目前所拥有的:

$ git checkout FETCH_HEAD -- '*.xlf'

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

感谢您的帮助。

【问题讨论】:

【参考方案1】:

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

git checkout -- "*.xml"

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

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

set -f
git checkout -- *.xml

当然,这将无法挽回地抹去您的更改!

【讨论】:

这绝对是最干净的解决方案。 如何匹配所有除了特定类型的文件? 这递归工作?至少在 Windows 上没有。 @aoetalks 对我来说它是递归工作的。但只有git checkout -- "*.xml" 版本(从索引签出)git checkout HEAD -- "*.xml"(从分支名称签出)看起来不能递归工作。【参考方案2】:

更新:请查看Dadaso's answer,了解适用于大多数情况的解决方案。

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

git checkout origin/master -- `git ls-tree origin/master -r --name-only | grep ".xlf"`

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

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

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

【讨论】:

谢谢,这解决了问题。发生在我身上的一件事是,如果文件扩展名中有错字,git 会抱怨“分离的头”。如果找到文件扩展名,则不会出现此消息。【参考方案3】:

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) 版本(如果路径中没有“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 答案中)。但是我发现几个 houndeds 文件的速度非常慢:

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

【讨论】:

【参考方案4】:

在 PowerShell 上(Windows,没试过 PowerShell Core+Linux),我可以这样做

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

【讨论】:

这个终于为我工作了,因为我的目录中有空格。我只需要在 $_ 部分加上 ""。【参考方案5】:

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

【讨论】:

按 blob 克隆现在是一件事顺便说一句:***.com/questions/600079/… :-)【参考方案6】:

我对所提供的解决方案有疑问,这是我的解决方案

    结帐所有更改从另一个分支git checkout branch -- ./ 只暂存特定类型git add \*.type 提交暂存文件git commit 重置其他文件git reset --hard

【讨论】:

以上是关于git checkout 仅用于整个项目的某些文件类型的主要内容,如果未能解决你的问题,请参考以下文章

每天一命令 git checkout

Git语法之Checkout使用

git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别

git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别

GIT checkout 和 reset 区别

git checkout 切换分支 文件无编辑权限