git 仅添加修改过的更改并忽略未跟踪的文件
Posted
技术标签:
【中文标题】git 仅添加修改过的更改并忽略未跟踪的文件【英文标题】:git add only modified changes and ignore untracked files 【发布时间】:2011-10-30 18:48:30 【问题描述】:我运行了“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")
【问题讨论】:
如果您在跟踪文件之后添加了 .gitignore 文件,那么 .gitignore 文件将不会忽略已经被跟踪的文件。这可能是个问题。 【参考方案1】:理想情况下,您的.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 .
””)。
【讨论】:
兴趣点,这个 (add -u
) 不添加仅 modified
文件,它还“添加”deleted
的文件.. 我是目前正试图阻止。
只添加修改过的文件,我通常去我的仓库的顶层目录并输入for fil in $(git diff --name-only --relative); do git add $fil; done
。如果我经常使用它(我不使用它),我会在我的~/.bashrc
文件中为此创建一个别名。当然,这只适用于 bash。
没有明确的答案,只有“适用于大多数人”的答案?我必须使用另一个过程才能正确执行此操作吗?这怎么没有内置到 git add 中?这似乎是一件很平常的事情。
n.b. 如果您有奇怪的文件名(空格、星号等),这些 cmets 中提到的方法将失败。要正确转义任何奇怪命名的文件,请使用:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
git add -u
是 git add --update
的缩写,git commit -a
是 git commit --all
的缩写【参考方案2】:
这对我有用:
#!/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 分组在测试表达式时非常有用。然后我可以在方括号内打印匹配项,看看我是对的。 @Ярослав 您的解决方案添加了已修改和未跟踪的文件,并且等于git add -u
,因此它没有回答问题。
--modified 似乎包括已删除以及刚刚修改
git diff-files -z --diff-filter=M --name-only | xargs -0 git add --dry-run 似乎运作良好。【参考方案3】:
暂存修改和删除的文件
git add -u
【讨论】:
【参考方案4】:git commit -a -m "message"
-a :在此提交中包含所有当前更改/删除的文件。但请记住,未跟踪的(新)文件不包括在内。 -m : 设置提交的消息
【讨论】:
【参考方案5】:我碰巧尝试了这个,所以我可以先看到文件列表:
git status | grep "modified:" | awk 'print "git add " $2' > file.sh
cat ./file.sh
执行:
chmod a+x file.sh
./file.sh
编辑:(见 cmets) 这可以一步完成:
git status | grep "modified:" | awk 'print $2' | xargs git add && git status
【讨论】:
这一步可以实现:git status | grep modified | awk 'print $2' | xargs git add && git status
是的,我也应该提供该解决方案,谢谢,我更新了帖子。【参考方案6】:
您没有说您当前的 .gitignore
是什么,但在您的根目录中包含以下内容的 .gitignore
应该可以解决问题。
.metadata
build
【讨论】:
我使用的 .gitignore 都错了。我在每个要忽略的目录中都有一个空的 .gitignore 文件,而不是在其中包含一个包含内容的 gitignore。 @Steve:如果每个 .gitognore
包含一个开头(忽略所有内容),这将起作用。但是顶层目录中的单个.gitignore
通常更易于使用并且足够了。【参考方案7】:
不确定这是功能还是错误,但这对我们有用:
git commit '' -m "Message"
注意空文件列表''。 Git 将其解释为提交所有修改过的跟踪文件,即使它们没有暂存,并忽略未跟踪的文件。
【讨论】:
这在使用 --amend 时确实不起作用。【参考方案8】:我想把修改过的文件放到暂存区,这样我就可以提交它们了
TL;DR:开始
使用交互模式(git add -i
),选择更新(在What now> prompt
中输入2
或u
),全选(在Update>>
提示中输入*
),退出交互模式(在@987654328中输入) @ 或 q
在 What now> prompt
)。
TL;DR:结束
对于更耐心的:---
第 1 步
您可以使用交互模式。
git add --interactive
或 简写形式,
git add -i
这将列出所有已修改文件及其状态,以及您可以使用的一系列命令选项,例如:
staged unstaged path
1: unchanged +17/-0 package-lock.json
2: unchanged +2/-0 package.json
3: unchanged +2/-28 src/App.js
4: unchanged +7/-6 src/App.test.js
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
第 2 步
根据您的情况,输入 u 或 2 对 What now>
,
What now>u
你在下面,
staged unstaged path
1: unchanged +17/-0 package-lock.json
2: unchanged +2/-0 package.json
3: unchanged +2/-28 src/App.js
4: unchanged +7/-6 src/App.test.js
Update>> *
第 3 步
在Update>>
提示符下,输入*
将上述列表中的所有文件添加到暂存区(您也可以通过提供逗号分隔的数字来添加单个文件),
Update>> *
此时,您所有修改过的文件都已添加到暂存区,您可以通过在What now>
提示符中输入1
或s
来验证状态(或者通过以下方式退出交互模式输入q
或7
并运行通常的git status
命令),
What now> 1
这将显示您的状态,
staged unstaged path
1: +17/-0 nothing package-lock.json
2: +2/-0 nothing package.json
3: +2/-28 nothing src/App.js
4: +7/-6 nothing src/App.test.js
我们可以在这里看到 unstaged 列显示列表中所有文件的文本 "nothing"。
关于忽略未跟踪文件的问题的第二部分,我相信这个SO answer 会有很大帮助。
【讨论】:
【参考方案9】:忽略的一种方法是使用git clean -xffd
,它将清除未跟踪的文件。那么你可以使用git add -A
【讨论】:
【参考方案10】:git commit -am "your message here"这对我有用
【讨论】:
以上是关于git 仅添加修改过的更改并忽略未跟踪的文件的主要内容,如果未能解决你的问题,请参考以下文章