本文记录一个我在 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(); 清理所有传入到启动进程的环境变量

参考文档:

Git - Git 钩子


本文会经常更新,请阅读原文: 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 社区

以上广告全是友情推广,无盈利