我使用了一些Xcode的源代码控制功能,特别是主编辑器中的blame功能,但是在命令行中使用git来实现我的所有实际版本控制。这意味着,通常,命令行上的git命令会失败并显示消息:
fatal: Unable to create '/path/to/repo/.git/index.lock': File exists.
Xcode正在创建此文件以锁定repo,因为它运行自己的git命令。我已经关闭了“首选项”中的所有不必要的源控制选项(自动刷新本地状态,自动刷新服务器状态,以及自动添加和删除文件。)
我目前的策略是重试命令直到它工作,这很少需要多次尝试。
有没有办法让Xcode在创建index.lock
的频率方面不那么激进?
或者,有没有一种方法可以让git自动重试命令,直到它们以这种方式失败成功为止?
答案 0 :(得分:3)
我可以让git自动重试命令,直到它们以这种方式失败成功为止?
不使用本机git:你需要编写一个git命令包装器脚本,它将循环并基本上等待index.lock消失(这类似于&#34的答案中描述的等待策略; {{3} }&#34)
那个包装器可以:
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的命令行程序,为inotify提供了一个简单的接口。这些程序可用于监视文件系统事件并对其进行操作
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/