如果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':文件存在“)
该包装可以:
例如,像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?