新的、未老化文件的Git警告

新的、未老化文件的Git警告,git,Git,我经常犯这样的错误:在创建提交时忘记提交新文件。我如何配置git以在存在未老化文件时警告和/或阻止我提交 注意,我说的是新文件。未对现有文件进行未分级的更改。我知道我可以自动包含那些带有-a的对象,除非您选择为其编写预提交挂钩,否则这实际上是不可能的 然而,这也不是一个好主意。根据您正在处理的项目,有些文件由于其性质(自动生成的大型二进制blob、系统配置、系统密钥等)而不希望提交。另外,如果你正在用Git做一些更高级的工作,比如,警告最多也会变成噪音 这或多或少是一个纪律问题,我的意思是以最好

我经常犯这样的错误:在创建提交时忘记提交新文件。我如何配置git以在存在未老化文件时警告和/或阻止我提交


注意,我说的是新文件。未对现有文件进行未分级的更改。我知道我可以自动包含那些带有
-a

的对象,除非您选择为其编写预提交挂钩,否则这实际上是不可能的

然而,这也不是一个好主意。根据您正在处理的项目,有些文件由于其性质(自动生成的大型二进制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)

也许不完全是你想要的,但对我来说确实如此。我的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) $ 

您可以使用pre-commit钩子来警告或阻止您在存在新创建但未老化的文件时提交

本质上,钩子必须将以前看到的未分页文件保存到一个文件中,以便在以后的提交过程中引用它们

在钩子中,如果
gitls files-o--exclude-standard--exclude from=[file]
不返回任何内容,那么您就是golden。否则,将输出附加到
[文件]
,并将上一个命令的结果作为警告输出,或使用非零状态代码退出

如果您选择中止而不是继续提交,并且希望保持文件未格式化,只需再次尝试提交:钩子将在之前看到它并忽略它


我编写了一个更高级的交互式版本,名为,您可以使用。

我不知道这是否可行,但我认为这不是一个好主意。通常存在不希望包含在存储库中的未老化文件
git status
将向您显示所有未格式化文件的列表。当然,我不想被禁止使用未格式化文件提交,但我确实希望得到警告。如果您确实忘记添加一些文件,您可以始终
commit--amend
。这里给出的第一个原因(某些文件不应提交)这似乎不是一个很好的理由,因为他们应该通过.gitignore从可能的提交候选对象中排除。或者说我缺少了一些要点?@JLRishe我在一个项目中工作,该项目有一个已损坏的POM文件,在一个与我的开发环境不匹配的特定路径中寻找一个特定的项目。在我们转移到Gradle解决POM试图解决的问题之前,我必须隐藏或恢复对本地POM所做的更改,以便我们的构建不会失败。由于明显的原因,我们无法将POM添加到.gitignore文件中。这就是为什么检查您正在提交的内容的步骤很重要的原因。