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

时间:2016-03-24 19:35:35

标签: xcode git version-control locking xcode7

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

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

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

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

有没有办法让Xcode在创建index.lock的频率方面不那么激进?

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

5 个答案:

答案 0 :(得分:3)

  

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

不使用本机git:你需要编写一个git命令包装器脚本,它将循环并基本上等待index.lock消失(这类似于&#34的答案中描述的等待策略; {{3} }&#34)

那个包装器可以:

这就是try and kill it

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)

答案 1 :(得分:2)

这是我的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
}

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

retry git commit -m "ohhh yeaaaa"

干杯!

答案 2 :(得分:1)

像其他人一样说git没有任何原生内容,但Chromium开发人员做了一个名为git-retry的python脚本,由shell包装器调用。

而不是输入例如:

git commit您需要输入git-retry commit

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

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

答案 3 :(得分:0)

我曾经使用Xcode的git客户端,并且它一直导致错误,包括这个,所以我已经停止使用Xcode来设置我的工作区或进行提交。为了启用此设置,我从Xcode X.x的命令行工具安装了git支持,并参考外部git GUI以获取导致更改本地或远程副本的任何命令,包括切换分支。

由于我已经开始使用外部客户端,因此我对index.lock文件没有任何问题。执行罕见操作时,例如重置远程分支或重命名分支,使用终端。有一些免费的高质量git客户端,包括SourceTree。

如果您想在Xcode中使用带有新项目的外部git客户端,只需选择加入git workspace选项(如果显示)。相反,使用外部git客户端“添加”另一个git工作区,并选择Xcode项目的根目录。

作为旁注,当我这样做时,我通常有一个根目录用于许多相关的杂项文件,这也是我的Xcode项目目录的主页,它是我的git工作区的根目录。这允许我有笔记,以及其他我不想被版本控制的文件。

这是一个典型的设置:

    + Project Directory
    ---+ Xcode project directory (git root)
    ---- Other project files (not under source control)

希望有所帮助!

答案 4 :(得分:-1)

由于此文件由git本身创建删除
如果您希望在创建时将其删除,则需要设置一些" watch"在文件上,当你看到它删除它。

一个简单的解决方案是安装一些" watch"插件将在创建文件时"捕获"

这项任务有很多库和工具。

以下是一些列表:

<强> inotify-tools

  

inotify-tools是一个C库和一组用于Linux的命令行程序,为i​​notify提供了一个简单的接口。这些程序可用于监视文件系统事件并对其进行操作

<强> fswatch

  

fswatch是一个文件更改监视器,它在修改指定文件或目录的内容时接收通知。

<强> Usage example:

fswatch -o ~/path/to/watch | xargs -n1 ~/script/to/run/when/files/change.sh

<强> watchdog

  

用于监控文件系统事件的Python API和shell实用程序。

您可以使用shell-command子命令执行shell命令以响应事件

watchmedo shell-command \
    --patterns="*.lock" \
    --recursive \
    --command='rm index.lock' \
    .

您是mac用户,但Windows用户可以安装以下任何程序,这些程序将监视何时创建文件

https://www.raymond.cc/blog/3-portable-tools-monitor-files-folders-changes/