如何在git checkout命令中使用正则表达式来指定文件子集

25

假设我想要检出一组 Git 文件,例如app/*^(.tmpl).html

如何将这个正则表达式放入git checkout branch -- (regex)中?


你从我的下面回答中使用了什么命令?是 find --regex 吗? - VonC
4个回答

31

如在“是否有办法在git checkout中使用通配符?”中提到:

Git无法处理通配符,但您的shell可以。

如下所述,您需要转义通配符字符,以便git进行解释:afile\*,或使用简单引号。

git checkout示例部分展示了通配符的用法:

rm hello.c
git checkout -- '*.c'

注意*.c周围的引号。
即使hello.c文件已不在工作树中,由于文件通配符用于匹配索引中的条目(而非shell中的工作树),它也会被检出。

另一种选择是使用find命令(例如,“git add *.js”未添加子目录中的文件”)。

find . -name '*js' -exec git checkout {} \;
您可以尝试使用 find -regex 进行正则表达式匹配。
例如,Tukaz评论中 使用了以下命令:
find ./packages/* -maxdepth 1 -name 'package.json' \
     -exec git checkout {} \; 
为了只检出我拥有的每个项目的package.json文件,并省略distnodemodules子文件夹,更现代的命令(自2014年以来)是Git 2.23+(Q3 2019)的git restore
git restore -s=aBranch -- '*.c'

使用符合pathspec描述的通配符模式'*.c'。


1
maxdepth运行正常!谢谢。 - Tukaz
@Tukaz 很好!你使用的完整的 find 命令是什么,包括 -maxdepth 参数? - VonC
找到./packages/*目录下的所有package.json文件,并执行git checkout {}命令,以便只检出每个项目的package.json文件,而忽略dist或nodemodules子文件夹。 - Tukaz
1
@Tukaz 谢谢您的反馈。我已将您的评论包含在答案中以增加可见性。 - VonC

6

我更新了这个答案,但我能够使用通配符进行git checkout,因此我相信现在这是可能的。 我正在运行git版本1.9.3。


5
请注意,星号必须进行转义:git checkout foo\*。转义后的命令不改变原意,但更加易于理解。 - Jamie Schembri

2
Git的pathspec特殊符号广告推广不足,但它们非常强大:
git checkout ':!*.tmpl.*' app/\*.html

1

我正在使用以下命令组合。

如果您需要远程分支:

git checkout $(git branch -a | grep "your-key-words-here" | grep remotes)

如果您只需要本地分支:

git checkout $(git branch | grep "your-key-words-here")

用法示例

主要开发人员按照来自JIRA或其他地方的任务编号对分支进行命名,因此使用这些命令,您可以更快地切换到所需的分支。

(1) 所有可用的本地分支:

  • feature/CAN2-1035_new_calculation_for_internal_transfer
  • feature/CAN2-921_new_ui
  • develop(当前)

要切换到feature/CAN2-1035_new_calculation_for_internal_transfer分支,您应输入以下命令:

git checkout $(git branch | grep CAN2-1035)

  • git branch - 将返回所有本地分支 (1)
  • grep CAN2-1035 - 将过滤(1)的结果,并仅返回包含CAN2-1035的结果

这些命令也可以提取到某个Bash命令中,以简化使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接