本文记录一个我在 git 钩子唤起一个 C# dotnet 的进程,在此进程里面使用 Process.Start 执行 git 命令的时候,被 git 钩子环境变量投毒的问题
核心代码非常简单,我只是使用 git add 命令而已
var sourceFolder = @"C:\lindexi\Work\Source\";
var processStartInfo = new ProcessStartInfo("git")
{
ArgumentList =
{
"add",
"."
},
WorkingDirectory = sourceFolder,
};
Process.Start(processStartInfo)!.WaitForExit();
在 git 钩子里面调起进程的时候,会额外注入许多环境变量,比如 GIT_INDEX_FILE 和 GIT_DIR 等,这些环境变量是指定的是当前的 git 钩子所在的 git 仓库的
这就导致了我设置了 WorkingDirectory = sourceFolder
无效,直接导致 git add 内容到当前 git 钩子所在的仓库,而不是 sourceFolder
仓库
解决方法是清空环境变量,解决被 git 钩子投毒
var processStartInfo = new ProcessStartInfo("git")
{
ArgumentList =
{
"add",
"."
},
WorkingDirectory = sourceFolder,
};
// 这是在 git 里面调用的,会被注入 git 的环境变量,从而被投毒,如 GIT_INDEX_FILE GIT_DIR 等,导致加入的文件不是在要求的路径
processStartInfo.Environment.Clear();
Process.Start(processStartInfo)!.WaitForExit();
以上代码核心是使用 processStartInfo.Environment.Clear();
清理所有传入到启动进程的环境变量
参考文档:
本文会经常更新,请阅读原文: https://blog.lindexi.com/post/git-%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98-%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%B0%83%E7%94%A8-git-%E6%97%B6%E5%8F%AF%E8%83%BD%E5%AD%98%E5%9C%A8%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E6%8A%95%E6%AF%92%E9%97%AE%E9%A2%98.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
如果你想持续阅读我的最新博客,请点击 RSS 订阅,推荐使用RSS Stalker订阅博客,或者收藏我的博客导航
本作品采用
知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:
https://blog.lindexi.com
),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请
与我联系
。
无盈利,不卖课,做纯粹的技术博客
以下是广告时间
推荐关注 Edi.Wang 的公众号
欢迎进入 Eleven 老师组建的 .NET 社区
以上广告全是友情推广,无盈利