ChatGPT解决这个技术问题 Extra ChatGPT

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

我运行了“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 文件将不会忽略已经被跟踪的文件。这可能是个问题。

F
Flimzy

理想情况下,您的 .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) 不会添加 only modified 个文件,它还会“添加” deleted 个文件.. 我目前正试图阻止的事情。
为了只添加修改过的文件,我通常会转到我的 repo 的顶层目录并输入 for fil in $(git diff --name-only --relative); do git add $fil; done。如果我经常使用它(我不使用它),我会在我的 ~/.bashrc 文件中为其创建一个别名。当然,这只适用于 bash。
没有明确的答案,只有“适合大多数人”的答案?我必须使用另一个过程才能正确执行此操作吗?这怎么没有内置到 git add 中?这似乎是一件很平常的事情。
nb 如果您有奇怪的文件名(空格、星号等),这些注释中提到的方法将失败。要正确转义任何名称奇怪的文件,请使用:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
git add -ugit add --update 的缩写,git commit -agit commit --all 的缩写
Я
Ярослав Рахматуллин

这对我有用:

#!/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 Grouping 在测试表达式时很好。然后我可以在方括号内打印匹配项,看看我是对的。
@Ярослав 您的解决方案添加了已修改和未跟踪的文件,并且等于 git add -u,因此它不回答问题。
--modified 似乎包括删除以及刚刚修改
git diff-files -z --diff-filter=M --name-only | xargs -0 git add --dry-run 似乎运作良好。
D
Dayamoy

暂存修改和删除的文件

git add -u


S
Saurabh
git commit -a -m "message"

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


或者只是 git commit -am "message"
M
Mike Q

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

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

这可以一步完成:git status | grep modified | awk '{print $2}' | xargs git add && git status
是的,我也应该提供该解决方案,谢谢,我更新了帖子。
K
Karl Bielefeldt

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

.metadata
build

我使用我的 .gitignore 都错了。我在每个要忽略的目录中都有一个空的 .gitignore 文件,而不是在其中包含一个包含内容的 gitignore 文件。
@Steve:如果每个 .gitognore 包含一个开始(忽略所有内容),这将起作用。但是顶层目录中的单个 .gitignore 通常更易于使用并且足够了。
E
Erik Englund

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

git commit '' -m "Message"

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


这在使用 --amend 时肯定不起作用。
A
Asif Kamran Malick

我想将修改后的文件放在暂存中,以便我可以提交它们

TL;DR:开始

使用交互模式 (git add -i),选择更新(在 What now> prompt 中键入 2u),全选(在 Update>> 提示符中键入 *),退出交互模式(键入 7 或 { 8} 在 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步

对于您的情况,针对 What now> 键入 u2

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> 提示符中输入 1s 来验证状态(或者通过输入 {4 退出交互模式} 或 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

我们可以在这里看到,未暂存的列显示列表中所有文件的文本“无”。

对于关于忽略未跟踪文件的问题的第二部分,我相信这个 SO answer 会有很大帮助。


N
Nithya

一种忽略的方法是使用 git clean -xffd,它将清除未跟踪的文件。那么你可以使用 git add -A


好吧,这是错误的建议! “git clean -xffd”将完全删除未跟踪的目录和文件,您不能称其为“忽略的方式”。在这种情况下,您真正应该做的只是 git add -u 仅添加先前暂存/修改/删除的文件。
C
Concepticio

git commit -am "your message here" 这对我有用