Git commit使用正则表达式还是通配符?

3

是否可以在例如git commit ".*my_file.*"中使用正则表达式

我尝试过,似乎只能将其解释为通配符。我还尝试了一个正则表达式标志:

git commit -regex ".*my_file.*"`

抛出一个错误。

有人知道如何将正则表达式与Git命令结合使用吗?


@NickVolynkin,globs可以同时用于git addgit commit,只是我不知道是否可以使用正则表达式,这对我来说会非常方便。 - undefined
哦,没错。我在 Git 参考文档中找到了这个语法;以前从未见过。 - undefined
1
也许你尝试添加未跟踪的文件?根据 Git 的参考文档:"通过将文件列为提交命令的参数,此时提交将忽略已暂存到索引中的更改,并记录所列文件的当前内容 (这些文件在 Git 中必须已经存在)。" - undefined
5个回答

2

我认为最好的方法是使用find命令。例如,如果你只想查找Python文件:

find -type f -regex ".*\.py$" -exec git commit {} -m "committing only and all python files" \;

有没有其他更简洁的想法?

1

与Git本身无关。Git只是从shell接收传递的文件列表,所以正则表达式匹配文件应由您的shell完成。我认为bash不能做到这一点,但其他shell可能可以。


Git还可以理解-- <filepattern>,其中<filepattern>可以是一个包含通配符的单引号字符串(因此不会被shell扩展);这些通配符可以用来选择要add的文件子集。例如:git add -- '*.el'将会添加当前目录和嵌套目录中的所有.el文件:通配符作用于整个名称,就像find命令中的-wholename一样。 - undefined
@coredump:这样做是可行的,但前提是当前目录中没有一个.el文件。如果存在这样的文件,shell将不会展开文件通配符模式,而是将一个字面的*.el传递给git add,然后git add会将其解释为一个模式规范。 - undefined
1
请查看此转录:http://pastebin.com/KmejAU3i。即使当前目录中有一个`.el`文件,它也能正常工作。扩展不是由shell完成的,因为通配符被引用了。 - undefined
@coredump:是的,抱歉,引用文件通配符将阻止shell将其扩展为文件列表,这种情况下它将按原样传递给git add - undefined

0
如 mipadi 所提到的,可以通过 shell 生成参数来为 git 生成输入。
例如,可以结合使用 ls 来实现这一点。假设我有一个已经进行了 git 初始化的目录,其中包含以下文件:
.git/
my_new_project_file.py
my_older_project_file.py
some_other_file.py

而且我想添加除了some_other_file.py之外的所有内容。要做到这一点:

ls my*project*.py | xargs git add

检查我的 `git status` 会显示两个文件已经被暂存,它们分别是 `my_new_project_file.py` 和 `my_older_project_file.py`,而 `some_other_file.py` 则被忽略了。
注意:`ls` 不支持正则表达式,只支持通配符。

1
这很酷,但是git已经支持通配符了:git add "my*project*.py"可以达到同样的效果。 - undefined
ls并不会扩展通配符,而是在ls运行之前,shell会先扩展通配符。无论如何,在脚本中不要使用ls,请参考不要在脚本中使用ls,另外还可以查看无用的ls用法 - undefined

0
正如Candic3所指出的那样,git支持通配符:
git add *my_file*

1
没有引号,它很可能是你例子中最有可能解释通配符的外壳。 - undefined

-1
答案似乎表明仅使用git是不可能的,而需要使用shell。
这在现在看来似乎不正确。在我的zsh中,这对我有效。
git -C path/to/repo checkout '**package-lock.json'

在zsh shell中,引号内的内容不会被展开,它会原样传递,所以git必须解释通配符。
我希望这在跨平台上都能正常工作。

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