如果index.lock存在,是否有办法让git自动重试命令?

我使用了一些Xcode的源代码控制功能,特别是主编辑器中的责备功能,但是在命令行上使用git来实现我所有的实际版本控制。 这意味着,相当经常,命令行上的git命令会失败并显示以下消息:

fatal: Unable to create '/path/to/repo/.git/index.lock': File exists.

Xcode创建这个文件来锁定repo,因为它运行自己的git命令。 我已经关闭了首选项中的所有不必要的源代码控制选项(自动刷新本地状态,自动刷新服务器状态,以及自动添加和删除文件。)

我现在的策略是重试命令,直到它运行,这很少需要一次尝试。

有没有办法让Xcode在创建index.lock频率上变得不那么激进?

或者,有没有办法让git能够自动地重试命令,直到他们成功,如果他们以这种方式失败?


我可以让git自动重试命令,直到他们成功,如果他们以这种方式失败?

不是使用原生git:你需要编写一个git命令包装器,它将循环并基本上等待index.lock消失(这与“Git-fatal:Unable to create'/ path”回答中描述的等待策略类似/my_project/.git/index.lock':文件存在“)

该包装可以:

  • 包括一个超时为了不会无限期地等待,
  • 尝试并在超时时搜索git进程并尝试并杀死它,以便最终释放该锁。
  • 例如,像SublimeText这样的IDE就是这样

    root = git_root(self.get_working_dir())
    if wait_for_lock and root and os.path.exists(os.path.join(root, '.git', 'index.lock')):
        print("waiting for index.lock", command)
        do_when(lambda: not os.path.exists(os.path.join(root, '.git', 'index.lock')),
            self.run_command, command, callback=callback, show_status=show_status, filter_empty_args=filter_empty_args, no_save=no_save, wait_for_lock=wait_for_lock, **kwargs)
    

    像其他人一样,git没有任何本地特性,但Chromium开发人员制作了一个名为git-retry的python脚本,该脚本被shell包装程序调用。

    而不是键入例如:

    git commit你会输入git-retry commit

    您可以通过克隆工具从他们的工具存储库中获取该工具:

    https://chromium.googlesource.com/chromium/tools/depot_tools.git


    下面是我的黑客修补程序:几行bash,等待锁定文件消失,然后运行您的git命令。 比赛条件当然是可能的,这不是防弹的,但大部分时间都可以使用。

    function retry {
        while [ 1 == 1 ]; do
            if test -f /path/to/repo/.git/index.lock; then
                echo -n ".";
                sleep 0.5;
            else
                "$@";
                return;
            fi  
        done
    }
    

    你可以把它放到你的〜/ .bashrc中,然后使用它:

    retry git commit -m "ohhh yeaaaa"
    

    干杯!

    链接地址: http://www.djcxy.com/p/90999.html

    上一篇: Is there a way to make git automatically retry commands if index.lock exists?

    下一篇: 2^n Itertools combinations with advanced filtering