2011-08-19 216 views
432

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

我想将修改后的文件放入分段中,以便我可以提交它们。当我运行“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") 
+0

,如果你已经添加了的.gitignore文件后,你已经跟踪文件,然后在.gitignore文件以不会忽视已被跟踪的文件。这可能是一个问题。 – BKSpurgeon

回答

602

理想情况下你应该.gitignore防止在状态正在显示未跟踪(而忽视)文件,添加使用git add等,所以我想请你纠正你.gitignore

你可以做git add -u,使其将阶段修改和删除的文件。

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

请注意,如果您有2.0版本的Git并使用了git add .,那么您需要使用git add -u .(请参阅“Difference of “git add -A” and “git add .”)。

+53

兴趣点,这('add -u')不会添加__only__'修改的'文件,它也“添加”'删除的'..我目前正试图阻止的东西。 –

+5

为了只添加修改后的文件,我通常会回到顶部目录,并在$(git diff --name-only --relative)中键入'for fil。做git add $ fil; done'。如果我使用它很多(我没有),我会在我的'〜/ .bashrc'文件中为这个做一个别名。当然,这只能在bash中工作。 –

+4

没有确定的答案,只有“为大多数人工作”的答案?我必须使用另一个进程才能正确执行此操作?这是不是内置于git add?这似乎是想要做的一件常见事情。 – Samuel

4

你没有说目前你的.gitignore是什么,但是一个.gitignore在你的根目录中有下面的内容应该有效。

.metadata 
build 
+2

我正在使用我的.gitignore所有的错误。我在每个想要忽略的目录中都有一个空的.gitignore文件,而不是在其中包含内容的单个gitignore。 – Steve

+1

@Steve:如果每个'.gitognore'包含一个开始(忽略所有内容),这将起作用。但是顶级目录中的单个'.gitignore'通常使用起来更加简单,并且足够了。 – maaartinus

60

这为我工作:

#!/bin/bash 

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

甚至更​​好:

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

如果不打算重用组,则不需要分组(\(\)),并且在文件名前为我留下空白。这并不会影响最终结果,但为了设置示例,我使用了sed命令:sed's /.* modified:* //'。在Mac OS X 10.9.5上进行了验证。 – Samuel

+0

@Samuel Grouping在测试表达式时很不错。然后,我可以在方括号内打印匹配,看看我是对的。 – user877329

+1

@Ярослав你的解决方案添加修改和未跟踪的文件,等于'git add -u',所以它不回答问题。 –

0

我正好试试这个,所以我可以看到文件列表第一:

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修改| awk'{print $ 2}'| xargs git add && git status' – meetalexjohnson

+0

是的我应该提供该解决方案,谢谢,我更新了这篇文章。 –

相关问题