Git添加不使用.png文件?

时间:2010-05-24 19:58:35

标签: git

我有一个脏的工作树,很脏,因为我对源文件进行了更改并修改了一些图像。我试图只将图像添加到索引中,所以我运行了这个命令:

git add *.png

但是,这不会添加文件。添加了一些 new 图像文件,但没有添加任何已修改/预先存在的图像文件。

是什么给出了?

编辑:这是一些相关的终端输出

$ git status
# On branch master
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   src/main/java/net/plugins/analysis/FormMatcher.java
#   modified:   src/main/resources/icons/doctor_edit_male.png
#   modified:   src/main/resources/icons/doctor_female.png
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   src/main/resources/icons/arrow_up.png
#   src/main/resources/icons/bullet_arrow_down.png
#   src/main/resources/icons/bullet_arrow_up.png
no changes added to commit (use "git add" and/or "git commit -a")

然后执行“git add * .png”(命令后无输出)

然后:

$ git status
# On branch master
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   src/main/resources/icons/arrow_up.png
#   new file:   src/main/resources/icons/bullet_arrow_down.png
#   new file:   src/main/resources/icons/bullet_arrow_up.png
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   src/main/java/net/plugins/analysis/FormMatcher.java
#   modified:   src/main/resources/icons/doctor_edit_female.png
#   modified:   src/main/resources/icons/doctor_edit_male.png

5 个答案:

答案 0 :(得分:17)

Michael Prozek的评论基本上就是答案。 *.png匹配当前目录中该名称的文件,而不是子目录中的文件。如果要在子目录中添加,请执行以下操作:

git add src/main/resources/icons/*.png

或者,根据您的shell,您可以这样做:

git add **/*.png

重点是它是执行globbing的shell(将* .png扩展为文件名列表)。 Git与此无关;它只需要shell给出的参数。

编辑:由于这个设法被接受,我应该继续并指出其他人做的一些git命令在内部支持globbing(通过fnmatch),所以如果你引用一个glob模式,它将被未经修改传递git的shell,将进行globbing扩展。

答案 1 :(得分:10)

Git的一些命令(包括git add)可以自己处理文件名模式。但首先你必须确保模式到达Git。

通常,不带引号的模式可能无法进入被调用的命令。作为一种特殊情况,如果模式不匹配任何文件(如果模式中没有斜杠,则在当前目录中), bash 会将未展开模式传递给命令(除非nullglob选项已设置,在这种情况下,模式参数将从传递给命令的参数中删除。但是这种行为因壳而异。默认情况下,除非nomatch选项未设置(将未展开的模式作为参数传递)或设置了null_glob选项,否则 zsh 会发出“找不到匹配项”之类的错误(从参数列表中删除模式。)

因此,如果您了解shell的行为并且您知道模式中指定的任何目录的内容(通常只是没有斜杠的模式的当前目录),那么使用不带引号的模式并期望它们到达底层命令是可靠的。 )。

因此,为了获得最大的可靠性,如果您希望git add将文字字符串*.png作为参数,那么您应该引用它。

git add \*.png
git add "*.png"
git add '*'.png
# etc.

成功将文件名模式传递给Git后,您将遇到一些与shell处理它们的区别。

此问题的主要区别在于匹配是由fnmatch(3) 完成的,而不设置 FNM_PATHNAME。这意味着像*.png这样的模式将匹配当前目录中的文件foo.png(就像shell一样),但它也将匹配dir/bar.png(因为没有FNM_PATHNAME * }可以匹配斜杠)。 Git将其模式称为“pathspecs”,以区别于shell“glob”模式。

不幸的是,git add处理pathspecs的方式不一致。它总是将它们应用于未跟踪的文件,但它永远不会将它们应用于跟踪的文件(相反,只检查文件类型参数,例如pathspecs,以检查跟踪文件列表的完全匹配)。这显然正是OP实际遇到的问题,因为它会添加与pathspec匹配的 new 文件,但无法更新(已经)跟踪了与pathspec匹配的文件。

只要您的shell支持git add **/*.png扩展模式(或等效的),Jefromi的解决方法(**)就可以正常工作。

你实际上可以让Git完成工作,但是使用shell可能更容易(如果你的shell支持它)。

# update all tracked files matching the Git pathspec *.png
git ls-files --cached -z \*.png | git update-index --add -z --stdin

平滑Git的内部路径规范处理是一个“中期”目标,但没有任何有时间,兴趣和相关经验的人已经上前解决。

它被提升为project idea for Google Summer of Code 2010(没有被任何人接收),相关问题偶尔出现在邮件列表上(1月和2010年3月,有人报告a symptom much like the OP'sGit's maintainer explained what he would like to see in the long term)。

答案 2 :(得分:1)

有疑问,请尝试:

git -A -- *.png 

,可能更全面(git add man page

-A
--all
  

-u类似,但除了索引外还与工作树中的文件匹配<filepattern>
  这意味着它将找到新文件以及暂存已修改内容并删除不再位于工作树中的文件。

请参阅问题“Difference of “git add -A” and “git add .

答案 3 :(得分:0)

像Mac OS X的默认设置不区分大小写的文件系统也会造成严重破坏。如果您将“目录”更改为“目录”,除非您移动到另一个临时文件夹,提交,移回并再次提交,否则您将无法识别它。

答案 4 :(得分:0)

git ls-files是列出git repo中所有内容的好方法

对于您的情况,您可以执行类似

的操作
git ls-files --modified | grep '\.png$' | xargs git add

列出修改后的文件,按扩展名过滤(本例中为.png),git添加结果条目