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

Luk*_*uke 8 git version-control xcode locking xcode7

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

fatal: Unable to create '/path/to/repo/.git/index.lock': File exists.
Run Code Online (Sandbox Code Playgroud)

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

我目前的策略是重试命令直到它工作,这很少需要多次尝试.

有没有办法让Xcode的创建频率更低index.lock

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

sma*_*sey 5

这是我的 hacky 补丁:几行 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
}
Run Code Online (Sandbox Code Playgroud)

例如,您可以将其放入 ~/.bashrc 中,然后使用它:

retry git commit -m "ohhh yeaaaa"
Run Code Online (Sandbox Code Playgroud)

干杯!


Von*_*onC 3

我可以让 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)
Run Code Online (Sandbox Code Playgroud)