首次推送前检查git远程是否存在

问题描述 投票:0回答:4

我正在编写一个 bash 脚本,我需要一个测试来查看给定的远程是否存在。

具体来说,假设我想测试远程

faraway
是否存在。如果我将某些事情推到
faraway
,我就可以做到
if [ -d .git/refs/remotes/faraway ]; then ...
。但据我所知,即使
faraway
不存在,仍然可以定义别名
.git/refs/remotes/faraway

另一种选择是解析

git remote
的输出并查看
faraway
是否出现在那里。但我想知道是否有一种更简单的方法来检查
faraway
是否已定义,无论
.git/refs/remotes/faraway/
是否存在。

git bash
4个回答
50
投票

一个想法:您可以在

git ls-remote faraway
上测试退出状态。这实际上会强制与远程设备进行通信,而不仅仅是在本地查找其存在或不存在。

if ! git ls-remote --exit-code faraway > /dev/null 2>&1; then
    ....
fi

48
投票

检查

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

11
投票

如果在

.git/config
中定义了远程服务器,您可以避免使用
git remote
ping 远程服务器。

if git remote | grep faraway > /dev/null; then
  ...
fi

2
投票

我在 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
是个好主意。然而,
--exit-code
在这里并不是正确的选择。手册页显示: 当在远程存储库中找不到匹配的引用时,以状态“2”退出。 这意味着
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,其中

git ls-remote
返回了 218467 个对象。我反复测试,
git ls-remote --tags
始终比
time git ls-remote --symref origin HEAD
快很多。我怀疑这是因为要搜索的
--tags
--heads
少,而后者需要找到所有
--heads
,然后线性搜索它们以找到与
HEAD
的匹配。 (我在这里猜测线性搜索假设 - 试图解释我看到的观察结果,而不是预测我没有看到的观察结果)。

© www.soinside.com 2019 - 2024. All rights reserved.