如果未设置用户电子邮件,如何进行git block提交?

Ceb*_*yre 17 git

我有单独的电子邮件地址,我用于工作项目和开源项目,我想确保我为每种类型的项目使用正确的.

显然,解决方案是适当地设置存储库特定的配置,遗憾的是我一直忘记设置它,直到我进行了一些提交,因此使用全局user.email配置,如果这与我的匹配,这很好工作,但不是那么好.

如果没有在任何地方设置user.email,那么只需要将本地用户名和主机连接在一起就可以了(对桌面机器来说不是很棒); 我希望它只是阻止提交.我不认为钩子会起作用,因为我希望这会发生在新的和克隆的repos上 - 如果我手动将钩子复制到repo中,我应该设置配置.

Von*_*onC 23

新更新(2016年2月,适用于git 2.8)

git 2.8(2016年3月)将添加一个新的解决方案:

请参阅Dan Aloni()提交的4d5c295(2016年2月6日). 帮助:Eric Sunshine(). 请参阅Jeff King()提交的59f9295(2016年2月4日). 帮助:Eric Sunshine().(通过合并JUNIOÇ滨野- -提交c37f9a1 2月17日2016)da-x
sunshineco
peff
sunshineco
gitster

ident:user.useConfigOnlyident不应该猜到的时候添加布尔值

它曾经是这样的:

git config --global user.email "(none)"
Run Code Online (Sandbox Code Playgroud)

是人们强迫自己设置user.email在每个存储库中的可行方式.
这对于拥有多个电子邮件地址的人有用,针对不同的克隆定位不同的电子邮件地址,因为它禁止git创建提交,除非user.email配置在per-repo配置中设置为正确的电子邮件地址.

最近的变化,19ce497(ident:保持一个标志虚假default_email,2015年12月10日进行的git 2.6.5 1月2016),然而,宣布一个明确的配置user.email不是假的,不管它的价值是什么,所以这黑客不再有效.

通过添加新配置变量提供相同的功能user.useConfigOnly; 设置此变量时,用户必须显式设置user.email配置.

所以从2016年3月开始和git 2.8,做:

git config --global user.useConfigOnly true
Run Code Online (Sandbox Code Playgroud)

您的任何新回购user.email 只会在其本地.git/config文件中查找.
如果user.email在本地git配置中找不到,则提交将不会继续.


请注意,它将在git 2.9(2016年6月)中进一步增强:

请参阅Marios Titas("`")提交d3c06c1,提交734c778(2016年3月30日).
(由Junio C gitsterHamano合并- -提交e7e6826,2016年4月29日)

ident:useConfigOnly在自动检测姓名/电子邮件之前检查

如果user.useConfigOnly设置,尝试自动检测名称和/或电子邮件是没有意义的.
自动检测甚至可能导致伪名称并触发错误消息.

ident:useConfigOnly出错时请"告诉我"消息

使用描述性较差的错误消息来阻止用户禁用user.useConfigOnly配置变量来解决此错误情况.我们希望鼓励他们设置user.name或user.email.

所以代替:

user.useConfigOnly set but no name given
user.useConfigOnly set but no mail given
Run Code Online (Sandbox Code Playgroud)

你会看见:

no name was given and auto-detection is disabled
no email was given and auto-detection is disabled
Run Code Online (Sandbox Code Playgroud)

原始答案(2012年9月)

有点像" 使用预提交挂钩停止特定作者的git提交 ",您可以定义一个默认的预提交挂钩,检查是否:

 git config --local user.email
Run Code Online (Sandbox Code Playgroud)

是空的.
如果是空的:exit 1

要确保您为正在创建的每个repo使用该默认挂钩,请参阅" 更改默认git挂钩 ".
它与" 分享你的git hooks "中描述的方法类似: