git push 错误 hook declined

我把仓库上传到 gogs 出现错误,提示如下 remote: hooks/update: line 2: E:/gogs/gogs.exe: No such file or directory gogs 仓库无法上传,一个原因是移动了gogs,如果把gogs放在移动U盘,插入时,上传经常出现这个问题。

在 push 的提示:

  git push origin master
Counting objects: 32, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (24/24), done.
Writing objects: 100% (32/32), 2.00 MiB | 0 bytes/s, done.
Total 32 (delta 19), reused 13 (delta 7)
remote: hooks/update: line 2: E:/gogs/gogs.exe: No such file or directory
remote: error: hook declined to update refs/heads/master
To [http://127.0.0.1:3000/lindexi/gogs.git](http://127.0.0.1:3000/lindexi/gogs.git )
 ! [remote rejected] master -> master (hook declined)
error: failed to push some refs to '[http://127.0.0.1:3000/lindexi/gogs.git'](http://127.0.0.1:3000/lindexi/gogs.git' )

那么如何解决。

可以看到是 hook 炸了,其中 update 文件出现找不到路径。

原因是我把 gogs 从E盘移动到D盘,于是 提交 gogs 仓库出现 remote: hooks/update: line 2: E:/gogs/gogs.exe: No such file or directory

解决方法:

打开 gogs 仓库 gogs ,注意我的gogs仓库之前所在是 E:\gogs\lindexi\gogs.git\ 所以我移动了路径但是里面的路径不会变,打开 update 文件。

可以看到:

  #!/usr/bin/env bash
  "E:/gogs/gogs.exe" update $1 $2 $3 --config='E:/gogs/custom/conf/app.ini'

于是我修改 E盘的路径到我现在使用的路径,就好了。

这问题是 update 钩子指向错误的路径。

简单的方法是:

进入控制板,重新生成所有仓库的 Update 钩子。这样就好了。

那么对于备份了 gogs 要恢复,需要如何做?

  1. 修改 custom/conf/app.ini

把 repository 路径修改现在的路径,同样修改日志

  1. 打开 gogs ,进入管理页面

重新生成所有仓库的 Update 钩子

如果对于 gogs 仓库在上传时出现的问题,可以去看gogs故障,也可以联系我:lindexi_gd@163.com

一般有时间我会去看看。

如果对于文章有疑问,欢迎交流。

我写了小程序,可以启动 gogs 判断他是不是移动路径,如果移动,就自动修改,程序很简单。

可以到 http://download.csdn.net/detail/lindexi_gd/9766835 下载。

可以把 gogs 放到任何地方,启动运行 启动.exe 运行可以关闭,gogs继续运行。

代码

    using System;
 using System.IO;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Xml;
 using IniParser;
 using IniParser.Model;

 namespace gogs.gocer
 {
    class Program
    {
        /// <summary>
        /// 自动迁移gogs
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            bool march = ReadCustomAppini();
            if (march)
            {
                Restore();
            }

            string str = System.AppDomain.CurrentDomain.BaseDirectory + "gogs.exe web";
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动
            p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
            p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
            p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
            p.StartInfo.CreateNoWindow = true;//不显示程序窗口
            p.Start();//启动程序

            //向cmd窗口发送输入信息
            p.StandardInput.WriteLine(str + "&exit");

            p.StandardInput.AutoFlush = true;
            //p.StandardInput.WriteLine("exit");
            //向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
            //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令

            p.OutputDataReceived += (s, e) =>
            {
                Console.Write(e.Data + "\r\n");
            };

            p.ErrorDataReceived += (s, e) =>
            {
                Console.Write(e.Data + "\r\n");
            };

            //获取cmd窗口的输出信息

            while (!p.HasExited)
            {
                Console.WriteLine(p.StandardOutput.ReadLine());
            }
         
            string output = p.StandardOutput.ReadToEnd();
            p.WaitForExit();//等待程序执行完退出进程
            p.Close();
            Console.WriteLine(output);
        }

        private static void Restore()
        {
            string file = System.AppDomain.CurrentDomain.BaseDirectory + "custom\\conf\\app.ini";

            var ini = new FileIniDataParser();
            IniData customAppini = ini.ReadFile(file);

            string gogs = System.AppDomain.CurrentDomain.BaseDirectory;
            customAppini["repository"]["ROOT"] = gogs.Replace("\\", "/");

            gogs = System.AppDomain.CurrentDomain.BaseDirectory + "log";
            customAppini["log"]["ROOT_PATH"] = gogs.Replace("\\", "/");

            using (StreamWriter stream = new StreamWriter(file))
            {
                ini.WriteData(stream, customAppini);
            }

            RestoreUpdate();

        }

        private static void RestoreUpdate()
        {
            var folder = new DirectoryInfo(System.AppDomain.CurrentDomain.BaseDirectory);
            var gogs = System.AppDomain.CurrentDomain.BaseDirectory + "gogs.exe";
            var gc = System.AppDomain.CurrentDomain.BaseDirectory + "custom\\conf\\app.ini";
            gogs = gogs.Replace("\\", "/");
            gc = gc.Replace("\\", "/");
            foreach (var temp in folder.EnumerateDirectories("*git", SearchOption.AllDirectories))
            {
                try
                {
                    var file = temp.FullName + "\\hooks" + "\\update";

                    string str = $"#!/usr/bin/env bash\n\"{gogs}\" update $1 $2 $3 --config='{gc}'";

                    using (StreamWriter stream = new StreamWriter(file))
                    {
                        stream.Write(str);
                    }
                }
                catch (Exception)
                {
                    
                }
            }
        }

        private static bool ReadCustomAppini()
        {
            //当前路径

            string file = System.AppDomain.CurrentDomain.BaseDirectory;

            //获取路径

            if (!file.EndsWith("\\"))
            {
                file += "\\";
            }
            file += "custom\\conf\\app.ini";
            if (!File.Exists(file))
            {
                return false;
            }
            var ini = new FileIniDataParser();
            IniData customAppini = ini.ReadFile(file);
            var gogs = customAppini["repository"]["ROOT"];
            gogs = gogs.Replace("/", "\\");
            if (!gogs.EndsWith("\\"))
            {
                gogs += "\\";
            }

            return gogs != AppDomain.CurrentDomain.BaseDirectory;
        }
    }
 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

win10 uwp 验证输入 自定义用户控件 Nuget使用库判断输入字符长度是否要检查长度判断如何写检查用户控件

TextBox是给用户输入,我们有时要用户只输入数字,而用户输入汉字,我们就有提示用户,那么这东西用到次数很多,我们需要做成一个控件。 我们可以用别人的库,我找...

1153
来自专栏大内老A

WCF技术剖析之六:为什么在基于ASP.NET应用寄宿(Hosting)下配置的BaseAddress无效

本篇文章来源于几天前一个朋友向我咨询的问题。问题是这样的,他说他采用ASP.NET应用程序的方式对定义的WCF服务进行寄宿(Hosting),并使用配置的方式对...

1957
来自专栏Core Net

ASP.NET Core 2.0 : 八.图说管道,唐僧扫塔的故事

2244
来自专栏james大数据架构

Android实现TCP断点上传,后台C#服务实现接收

终端实现大文件上传一直都是比较难的技术,其中涉及到后端与前端的交互,稳定性和流量大小,而且实现原理每个人都有自己的想法,后端主流用的比较多的是Http来实现,因...

3159
来自专栏分布式系统进阶

Cluster版本中的Meta

1104
来自专栏Jackson0714

03.如何实现一个遥控器-命令模式

3607
来自专栏java架构师

解决ASP.NET中的各种乱码问题

总结分类: 一、页面显示乱码 1、如果web.config配置:<globalization fileEncoding="utf-8" /> 如果文件编码不是...

3199
来自专栏大内老A

ASP.NET Core应用针对静态文件请求的处理[3]: StaticFileMiddleware中间件如何处理针对文件请求

我们通过《以Web的形式发布静态文件》和《条件请求与区间请求》中的实例演示,以及上面针对条件请求和区间请求的介绍,从提供的功能和特性的角度对这个名为Static...

3305
来自专栏大内老A

通过一个模拟程序让你明白WCF大致的执行流程

在《通过一个模拟程序让你明白ASP.NET MVC是如何运行的》一文中我通过一个普通的ASP.NET Web程序模拟了ASP.NET MVC的执行流程,现在我们...

2166
来自专栏游戏开发那些事

【游戏开发】Excel表格批量转换成lua的转表工具

  在上篇博客《【游戏开发】Excel表格批量转换成CSV的小工具》 中,我们介绍了如何将策划提供的Excel表格转换为轻便的CSV文件供开发人员使用。实际在U...

2623

扫码关注云+社区

领取腾讯云代金券