将所有文件添加到除单个文件之外的提交中?

use*_*701 503 git git-add

我在变更集中有一堆文件,但我想特别忽略一个修改过的文件.看起来像这样git status:

# modified:   main/dontcheckmein.txt
# deleted:    main/plzcheckmein.c
# deleted:    main/plzcheckmein2.c
...
Run Code Online (Sandbox Code Playgroud)

有没有办法可以做git add但只是忽略我不想触摸的一个文本文件?就像是:

git add -u -except main/dontcheckmein.txt
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 770

git add -u
git reset -- main/dontcheckmein.txt
Run Code Online (Sandbox Code Playgroud)

  • 如何排除整个文件夹? - 主要/主要/或主要/*? (27认同)
  • @MariusKavansky你可以使用所有这些形式.如果你使用`main/*`,就必须在它前面添加`--`让git知道它是一个路径.其他两个变体在不包括两个破折号的情况下工作.(在Windows 7上使用msysGit在命令提示符中测试) (7认同)
  • @本·杰克逊(Ben Jackson)会在每一行中发表评论,您不觉得吗? (3认同)
  • 如果您要排除包含大量文件或其他文件夹的文件夹:暂时将它们添加到您的gitignore.之后对这些文件夹执行````git reset```仍然有效,但是添加大文件夹需要花费很长时间. (2认同)
  • 那么,没有单行吗? (2认同)
  • @Simeon `git reset` 总是做两件事(切换分支和恢复文件)。当 10 年前写下这个答案时,“git Restore”还不存在(它是在 2019 年添加的)。现在你也可以用“git Restore”来写这个答案,因为它做了一些与“reset”相同的事情 (2认同)
  • “其他答案中对此进行了解释”,其中有22个,所以您可以更新一下以给我们提示吗?谢谢! (2认同)

Aqu*_*wer 123

1)开始忽略对单个已经版本化的文件的更改

git update-index --assume-unchanged "main/dontcheckmein.txt"
Run Code Online (Sandbox Code Playgroud)

并撤消 git update-index --no-assume-unchanged "main/dontcheckmein.txt"

检查一下

2)完全忽略特定的单个文件,防止在存储库中创建它

首先看看这个Git全局忽略不起作用

并且在.gitignore没有前导的情况下添加文件的相对路径./

所以,如果你的文件在MyProject/MyFolder/myfile.txt(在哪里.git也是MyProject),.gitignore你只需要这样MyFolder/myfile.txt

您可以确认与忽略相关的规则 git check-ignore "MyFolder/myfile.txt"

关于全局忽略

这个链接说的是~/.gitignore_global; 但该文件与您的项目有关; 所以,如果你把排除模式MyFolder/myfile.txt~/.gitignore_global,它会工作,但不会太大的意义...

在另一方面,如果你设置你的项目git config core.excludesfile .gitignore,其中.gitignore在为MyProject; 该设置将覆盖~/.gitignore_global,可以有非常有用的规则 ......

所以,就目前而言,我认为最好是做一些脚本来混音.gitignore~/.gitignore_global.gitignore.

最后一个警告
如果您要忽略的文件已经在存储库中,除非您执行此操作git rm "MyFolder/myfile.txt",否则此方法将不起作用:,但请先备份它,因为它也将在本地删除!你可以稍后复制一下......

  • 您可以使用`git rm --cached MyFolder/myyfile.txt`从存储库中删除该文件,但将其保存在本地.[help.github.com上的说明](https://help.github.com/articles/ignoring-files/) (5认同)

Rit*_*tan 75

对于文件

git add -u
git reset -- main/dontcheckmein.txt
Run Code Online (Sandbox Code Playgroud)

对于文件夹

git add -u
git reset -- main/*
Run Code Online (Sandbox Code Playgroud)

  • 为什么-u必要?为什么不`git add.&& git reset - main/*`? (7认同)
  • -u 用于引用您当前推送到的分支。你将不再需要在下一次推送中输入``git Push origin master```,只需````git Push```,git 就会知道它在 master 分支中。希望能帮助到你。 (5认同)
  • -u 选项更新索引已经有匹配 <pathspec> 的条目的位置。这将删除和修改索引条目以匹配工作树,但不添加新文件。如果在使用 -u 选项时未给出 <pathspec>,则更新整个工作树中的所有跟踪文件(旧版本的 Git 用于将更新限制为当前目录及其子目录)。 (2认同)
  • 谁能用非git专业人士能理解的语言解释为什么-u是必需的? (2认同)

cat*_*yes 47

现在git支持exclude certain paths and filespathspec magic :(exclude)及其简短形式:!.因此,您可以轻松地按以下命令实现它.

git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt
Run Code Online (Sandbox Code Playgroud)

实际上你可以指定更多:

git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
Run Code Online (Sandbox Code Playgroud)

  • 太好了!请注意,在Linux上,您需要引用`:!...`子句以防止shell抱怨。因此,例如:`git add --all-':!path / to / file1'':!path / to / file2'':!path / to / folder1 / *'`。 (10认同)
  • 如果没有“:!...”周围的引号,我也会在 Windows 10 git bash 中收到“未找到事件”错误。看看@Martin_W 的评论 (4认同)
  • 最佳答案,谢谢!至少,就我而言:我只需要排除文件类型。 (3认同)
  • 这与 zsh 中的某些内容发生冲突,在 macOS 和最新的 git 上对我不起作用。 (3认同)
  • 注意,路径是相对于当前目录的!即如果你在 `./path/` 中,只需使用 `git add --all -- ':!to/file1'` (2认同)
  • 这是最好的答案。如果需要排除包含大量文件的大文件夹,则添加和重置需要很长时间。`git add -- . ':!<path>'` 更快。 (2认同)
  • 'git add . --:!path/to/file` 也可以工作吗?`git add .` 和 `git add -- .` 之间有区别吗?“.”之前是否需要第一个“--”? (2认同)

Nik*_*iko 31

Git:(exclude)为要排除的路径提供了 pathspecs 前缀。

\n

它的简短魔法签名是:^
\n文档: https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-exclude

\n
git add . :^main/dontcheckmein.txt\n
Run Code Online (Sandbox Code Playgroud)\n

该线程的一些答案提到:!,这也可以工作,但只能使用引号。一般来说,!对于 shell 扩展来说,被认为是一个可怕的角色。

\n
\n

如果你像我一样 \xe2\x80\x94 总是使用命令 \xe2\x80\x94-p中的标志检查将要提交的内容git add:^ xe2\x80\x94魔法签名也像一个魅力一样:

\n
git add -p . :^main/dontcheckmein.txt\n
Run Code Online (Sandbox Code Playgroud)\n


Ant*_*deo 19

虽然本杰克逊是正确的,但我想我会添加我一直在使用该解决方案的方式.下面是我使用的一个非常简单的脚本(我称之为gitadd)来添加所有更改,除了我保留在一个名为的文件中列出的少数几个.gittrackignore(非常类似于.gitignore如何工作).

#!/bin/bash
set -e

git add -A
git reset `cat .gittrackignore`
Run Code Online (Sandbox Code Playgroud)

这就是我目前的.gittrackignore样子.

project.properties
Run Code Online (Sandbox Code Playgroud)

我正在开发一个Android项目,我在部署时从命令行编译.这个项目依赖于SherlockActionBar,因此需要在project.properties中引用,但是这与编译有关,所以现在我只需键入gitadd并添加所有更改到git,而不必每次都取消添加project.properties.


Dan*_*cki 8

git add .
git reset main/dontcheckmein.txt
Run Code Online (Sandbox Code Playgroud)


rm *_*tar 8

我们可以添加所有文件并排除必须通过 git Reset 删除的文件。

git add .
git reset -- <file_name_to_exclude>
Run Code Online (Sandbox Code Playgroud)


Dha*_*wan 6

用于git add -A一次性添加所有已修改和新添加的文件。

例子

git add -A
git reset -- main/dontcheckmein.txt
Run Code Online (Sandbox Code Playgroud)


gsu*_*umk 5

为了保留文件中的更改但不提交,我这样做了

git add .

git reset -- main/dontcheckmein.txt

git commit -m "commit message"

验证文件是否被排除

git status