我正在编写一个 bash 脚本,我需要一个测试来查看给定的远程是否存在。
具体来说,假设我想测试远程
faraway
是否存在。如果我将某些事情推到 faraway
,我就可以做到 if [ -d .git/refs/remotes/faraway ]; then ...
。但据我所知,即使 faraway
不存在,仍然可以定义别名 .git/refs/remotes/faraway
。
另一种选择是解析
git remote
的输出并查看 faraway
是否出现在那里。但我想知道是否有一种更简单的方法来检查 faraway
是否已定义,无论 .git/refs/remotes/faraway/
是否存在。
一个想法:您可以在
git ls-remote faraway
上测试退出状态。这实际上会强制与远程设备进行通信,而不仅仅是在本地查找其存在或不存在。
if ! git ls-remote --exit-code faraway > /dev/null 2>&1; then
....
fi
检查
faraway
是否在.git/config
中定义的另一种方法:
if git config remote.faraway.url > /dev/null; then
…
fi
要检查
faraway
isn't 是否已定义,请在条件前加上 !
:
if ! git config remote.faraway.url > /dev/null; then
…
fi
如果在
.git/config
中定义了远程服务器,您可以避免使用 git remote
ping 远程服务器。
if git remote | grep faraway > /dev/null; then
...
fi
我在 bash 中发现的最快、最可靠的方法是:
if timeout 30s git ls-remote --tags > /dev/null 2>&1; then
# Note: it takes 2~4 sec to get to here.
echo "git server IS available"
else
# Note: it takes 30 seconds (as specified by `timeout`) to get to here.
echo "git server is NOT available"
fi
如果您的服务器在正常情况下无法在这段时间内做出响应,则可以选择将
timeout 30s
值增加到更大的秒数。
有关完整详细的解释,请参阅我的主要答案:检查 git 服务器是否可用的最快方法。
请注意,我不建议使用
--exit-code
选项,因为@Jo Liss在这里所说的:
是个好主意。然而,-h
在这里并不是正确的选择。手册页显示: 当在远程存储库中找不到匹配的引用时,以状态“2”退出。 这意味着--exit-code
对于刚刚使用git ls-remote --exit-code "$REPO_URL"
初始化的空存储库将失败。git init
此外,我绝对建议使用
--tags
而不是 -h
或 --heads
,以便在 git 服务器 is 可用时尽可能快地执行此命令。请参阅我的速度比较在我的问题中。为了您的方便,它们再次出现。持续使用--tags
需要2~4秒,而--heads
需要3~10秒。
# 4~25 sec
# 218467 lines
time git ls-remote | wc -l
# 3~18 sec
# 218076 lines
time git ls-remote --refs | wc -l
# 3~10 sec
# 43337 lines
time git ls-remote --heads | wc -l
# 2~4 sec
# 9769 lines
time git ls-remote --tags | wc -l
# 0.002 ~ 0.008 sec
# But worthless! It passes even if the remote is not available!
time git ls-remote --get-url
# 4~25 sec
# 1 line
time git ls-remote origin HEAD
另请参阅我的评论:
@torek,供您参考,这是一个超过 100 GB 的巨大 GitHub Enterprise mono-repo,其中
返回了 218467 个对象。我反复测试,git ls-remote
始终比git ls-remote --tags
快很多。我怀疑这是因为要搜索的time git ls-remote --symref origin HEAD
比--tags
少,而后者需要找到所有--heads
,然后线性搜索它们以找到与--heads
的匹配。 (我在这里猜测线性搜索假设 - 试图解释我看到的观察结果,而不是预测我没有看到的观察结果)。HEAD