有没有一种方法可以仅从文件夹中提交一个文件类型扩展名?

45

我有一个文件夹,里面有很多东西,我想只提交扩展名为".c"的文件。是否有命令可以实现这个功能,还是我需要手动添加每个文件名?


7
很容易。git add *.c && git commit -m '我的提交' - Ryan
3
如果您永远不想提交特定扩展名的文件,请使用 gitignore - Matt Ball
嗯,看起来不错 - 我正在尝试 git add .c,让我在这里检查一下是否有效哈哈。 - Victor Oliveira
是的,我已经了解了“git inore”,但它对于这个小任务来说太过强大了 - 无论如何还是谢谢你;@self兄弟,非常好用,谢谢!请将其作为答案添加,这样我就可以接受=D - Victor Oliveira
5
实际上,“git add .c”在文件选择过程中并不涉及“git”:通配符“.c”由bash解释,因此您可以使用“echo *.c”列出您的.c文件...这称为通配符扩展,了解它的工作原理确实会很有帮助。 - cmaster - reinstate monica
9个回答

66

对于我来说,仅仅使用 git add *.c 并没有起作用。我遇到了这样的致命错误:

git add *.php
The following paths are ignored by one of your .gitignore files:
wp-config.php
Use -f if you really want to add them.
fatal: no files added

所以,在这个变种中,Git 尝试添加被忽略的文件。

但是这样的变种:

git add \*.php

运行得非常顺利。顺便说一句,你可以以同样的方式执行git diff:

工作得非常顺畅。顺便说一下,您可以以同样的方式执行git diff:

git diff -- \*.php

2
如果是 Bash Globbing 或 Git Globbing,这就有意义了。很棒,谢谢。 - Jay Day Zee
2
在zsh shell(OS X)上使用\转义*就可以解决问题了。在bash shell上只需执行add *.extension即可正常工作。 - Suneel
git add *.js(例如)对我有效-仅当您查看的扩展名文件在同一目录中时! git add \*.js.js文件添加到所有子目录中,您是正确的。因此,如果没有反斜杠,则bash或zsh或其他内容会扩展全局,并且仅匹配当前目录,但是使用反斜杠,全局由git处理并在子文件夹中工作。 - drkvogel

23
如果你想添加所有具有特定文件扩展名的文件,你只需要在使用通配符暂存文件时指定它即可。
在这里,.c 可以是任何你想要的扩展名。

2
这对我没有起作用。我试图在项目的不同路径中添加xml文件。git add *.xml没有起作用,git add *.xml对我有用。 - mickeymoon
我的回答说明你必须将“.c”部分更改为任何文件扩展名,它就可以工作。请将“.c”视为占位符值。 - Ryan
12
是的,我在我的情况下将 .c 改为了 .xml。我想上面的评论可能会让人产生误解,git add \*.xml 对我有用,而不是像 Sergey 的答案中那样使用 git add *.xml - mickeymoon
3
同样的问题,git add *.c 无法工作,但是 git add \*.c 可以。也许这个答案需要更新。 - Rogerio Schmitt
更新:关于反斜杠问题,您需要检查当前目录。我发现从最大的目录开始工作最容易,然后像 git add *.c 这样的命令 - 或者您使用的任何扩展名 - 将会起作用。 - Ryan Z Johnson
类似于 git add '*.c' 对我来说起作用了。 - ryuzakyl

20

如果您只关心文件夹中直接的文件,但不担心从子文件夹添加给定扩展名的文件,则@Ryan的答案将起作用。

如果您想要递归地添加基本文件夹和所有子文件夹中具有相同扩展名的所有文件,则可以使用:

git add [path]/\*.java

要添加子目录中的*.java文件,或者

git add ./\*.java

对于当前目录。

(来源于git add文档)


10
复制其他答案,稍作修改:要通过掩码(例如*.xml)包含当前文件夹和子文件夹中的文件,您可以使用以下方法:
git add ':/*.xml'

注意:使用单引号将阻止 shell(sh、bash、zsh 等)展开 * 字符,并将参数直接传递给 git,以便让 git 处理通配符扩展而非你的 shell。
不带引号的情况下,git add *.xml 将被展开,实际传递给 git 的参数将是由你的 shell 生成的匹配文件列表,例如 git add 1.xml 2.xml 3.xml...

实际上,只有 git add :/*.pdf 会产生错误 "no matches found: :/*.pdf" ... 然后我看到了你的答案! - Fernando Espinosa
1
这个对于 git diff -w ':/*.md' 也适用!谢谢! - JayRizzo

7

如果您要添加的文件与您在同一目录中,则使用简单的*通配符即可正常工作:

git add *.c

如果您在存储库的不同子目录中,则可以使用带有魔法签名的路径规范,如 git词汇表中所述,以添加工作树中任何目录中具有.c扩展名的所有文件
git add :/*.c

任何以 : 开头的 git 路径规范都有特殊含义。在简短形式中,冒号 : 后面跟着零个或多个“魔法签名”字母。魔法签名 / 使模式匹配从工作树的根开始,即使您正在子目录中运行命令也是如此。

2

如果你使用带有zsh的mac,你需要使用引号。

git add *.rb
zsh: no matches found: *.rb

使用引号应该可以正常工作:

git add '*.rb'

1

对我来说,被接受的答案并没有起作用。你需要在通配符前面添加\,就像下面这样。

git add \*.c
git add \*.py

0
我会像这样提交所有特定文件,而不用进行添加操作:

git commit -m "My commit message" -- "*.myFileExtention"

示例 - 提交所有 Kotlin 文件:

git commit -m "My commit message" -- "*.kt"

对于你来说,这将是:

git commit -m "My commit message" -- "*.c"

0
在PowerShell Visual Code中,我只是简单地执行了以下操作:
git add *.scss

所有这些类型的文件都已添加。

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