git只添加修改的更改并忽略未跟踪的文件


658

我运行了“ git status”,下面列出了一些已修改的文件/或在“未暂存提交的更改”标题下。它还列出了一些我想忽略的未跟踪文件(这些目录中有一个“ .gitignore”文件)。

我想将已修改的文件放在暂存中,以便我可以提交它们。当我运行“ git add。”时,它添加了修改后的文件以及我要忽略的文件。

如果显示以下git状态,我如何仅添加修改后的文件而忽略未跟踪的文件。

另外,我的“ .gitignore”文件是否正常工作?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")

1
如果您在跟踪文件后添加了.gitignore文件,则.gitignore文件将不会忽略已被跟踪的文件。那可能是个问题。
BKSpurgeon '16

Answers:


904

理想情况下,您.gitignore应该防止未跟踪(和忽略)的文件显示为状态,或使用git add等添加。因此,我请您更正您的文件。.gitignore

您可以这样做,git add -u以便登台已修改和删除的文件。

您也可以git commit -a只提交修改和删除的文件。

请注意,如果您具有2.0之前的Git版本并已使用git add .,则需要使用git add -u .(请参阅git add -A”和“ git add .”的区别)。


74
兴趣点,这(add -u)不添加唯一 modified的文件,还补充说:“” deleted那些东西..我目前正在试图阻止。
Zach Lysobey

6
要仅添加修改后的文件,通常会在回购的顶层目录中输入for fil in $(git diff --name-only --relative); do git add $fil; done。如果我经常使用它(我不这样做),我将在~/.bashrc文件中为此做一个别名。当然,这仅适用于bash。
Krøllebølle

8
没有明确的答案,只有“为大多数人工作”的答案?我必须使用其他过程才能正确执行此操作吗?git add怎么不内置呢?想要做的事情似乎很普通。
塞缪尔

2
注意,如果文件名奇数(空格,星号等),这些注释中提到的方法将失败。要正确转义任何名称不正确的文件,请使用:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
Orwellophile

3
git add -u是短期的git add --updategit commit -a是短期的git commit --all
雨果

95

这为我工作:

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

甚至更好:

$ git ls-files --modified | xargs git add

如果您不打算重复使用该组,则不需要分组(()),并且\ s在文件名前面留有空白。并不是说在这种情况下会影响最终结果,但是为了举例说明,这里是我使用的sed命令:sed's /.* modified:* //'。在Mac OS X 10.9.5上进行了验证。
塞缪尔

测试表达式时,@ Samuel分组很不错。然后,我可以将匹配项打印在方括号内,以确保我是对的。
user877329 2015年

1
@Ярослав您的解决方案添加了经过修改和未跟踪的文件,并且等于git add -u,因此无法回答问题。
尼克·沃林金

7
--modified似乎包括已删除的内容以及刚刚修改的内容
DMart 2015年

2
git diff-files -z --diff-filter = M-仅名称| xargs -0 git add --dry-run似乎运行良好。
DMart 2015年

10
git commit -a -m "message"

-a:在此提交中包括所有当前已更改/删除的文件。但是请记住,不包括未跟踪的(新)文件。

-m:设置提交的消息


4

您没有说当前是什么.gitignore,但是.gitignore在根目录中包含以下内容的a 应该可以解决问题。

.metadata
build

3
我使用.gitignore都错了。我想忽略的每个目录中都有一个空的.gitignore文件,而不是其中包含内容的单个gitignore。
史蒂夫

1
@Steve:如果每个都可以。gitognore包含一个开始(忽略所有内容)。但是.gitignore,顶层目录中的单个目录通常更易于使用且足够。
maaartinus 2014年

2

我碰巧尝试了这个,所以我可以先看到文件列表:

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

执行:

chmod a+x file.sh
./file.sh 

编辑:(请参阅评论)这可以一步完成:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status

1
这可以一步完成:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom

是的,我也应该提供该解决方案,谢谢,我更新了帖子。
Mike Q

1

不知道这是功能还是错误,但这对我们有用:

git commit '' -m "Message"

注意空文件列表“。Git将其解释为提交所有已修改的跟踪文件(即使它们未暂存),并忽略未跟踪的文件。


这绝对没有使用--amend时工作。
GhostCat

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.