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-tree
和grep
:
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 -f的区别;git add . git add -u git add -A的区别
git checkout .和git checkout -f的区别;git add . git add -u git add -A的区别