新的、未被跟踪的文件的Git警告

6

我经常犯错,创建提交时忘记暂存新文件。如何配置git,在有未暂存的文件时警告和/或阻止我进行提交?

注意,我说的是新文件。不是现有文件的未暂存更改。我知道可以使用-a自动包含这些更改。


2
我不知道这是否可能,但我认为这不是一个好主意。通常有一些未暂存的文件,你不想将它们包含在代码库中。git status 命令会显示所有未暂存文件的列表。 - mkrieger1
当然,我不希望被禁止提交未暂存的文件,但我希望收到警告。 - Michael Gummelt
如果您忘记添加某些文件,您总是可以使用 commit --amend 命令进行修正。 - mkrieger1
3个回答

4

除非您选择编写预提交挂钩,否则这不是一件可能的事情。

然而,这也不是一个好主意。根据您所工作的项目,由于它们的性质(自动生成、大型二进制 Blob、系统配置、系统密钥等),有些文件是您不想提交的。此外,如果您在使用 Git 进行更高级的工作,比如拆分提交块,那么警告最多只会变成噪音。

这更多是一个纪律问题,我是以最好的方式说这句话的。人们必须习惯执行检查某些东西(准确地说,正确的东西)是否已暂存才能提交的步骤。这意味着您必须经常键入以下命令:

git status
git add . # or whatever variant of add you need to work with
git status
git commit
git push (ideally when ready)

这里给出的第一个原因(某些文件不应提交)似乎并不是一个好的理由,因为它们应该通过.gitignore从可能的提交候选项中排除。或者我有什么地方没有理解到吗? - JLRishe
@JLRishe 我正在处理一个项目,其中POM文件已损坏,正在寻找特定路径中的特定项目,但与我的开发环境不匹配。在我们能够转移到Gradle来解决问题之前,我必须隐藏或还原对本地POM所做的更改,以便我们的构建不会失败。由于明显的原因,我们不能将POM添加到.gitignore文件中。这就是检查您要提交的内容的步骤很重要的原因。 - Makoto

3

可能不完全符合您的要求,但对我来说它很有用。我的bash提示根据我所在的仓库状态显示不同的状态。这还检查未跟踪的文件。

export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWSTASHSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true
export PS1='${debian_chroot:+($debian_chroot)}\[\033[01;33m\]\w\[\033[01;32m\]$(__git_ps1) \[\033[01;36m\]$ \[\033[00m\]'

这将在命令行工作时提供一些有用的信息。当您添加一个新的未跟踪文件时,请注意 '%' 符号。
/tmp/myrepo (master) $ touch newfile.txt
/tmp/myrepo (master %) $ git add newfile.txt 
/tmp/myrepo (master +) $ git commit -m 'added newfile'
[master 9fe6399] added newfile
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 newfile.txt
/tmp/myrepo (master) $ 

0
你可以使用 pre-commit 钩子在提交时检查是否有新创建但未暂存的文件,并对其进行警告或阻止。
实质上,此钩子必须将以前看到的未暂存文件保存到一个文件中,在以后的提交中引用它们。
在钩子中,如果 git ls-files -o --exclude-standard --exclude-from=[file] 返回空,则正常。否则,将输出附加到 [file] 并作为警告输出之前命令的结果,或以非零状态码退出。
如果您选择放弃提交而不是继续并希望保留一个未暂存的文件,则只需再次尝试提交即可:钩子已经看到了它并忽略它。
我编写了一个更高级的交互式版本叫做 git-stagelight,您可以使用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接