【问题标题】:git checkout only certain file types for entire projectgit checkout 仅用于整个项目的某些文件类型
【发布时间】: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" 文件,但不会递归到子目录。

感谢您的帮助。

【问题讨论】:

    标签: git


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

      【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多