脚本是否有一种简单的方法来检测是否已存在远程控制器,并仅在不存在时才添加远程控制器?水暖命令或瓷器标志?
在使用现有遥控器运行git remote add foo https://example.net
时,我得到:
fatal: remote foo already exists.
理想情况下,会有--if-not-exists
或--update-if-exists
之类的标记,但在documentation中找不到任何标记。
我正在考虑提取git remote
的输出,但是有更好的方法吗?
答案 0 :(得分:2)
git config remote.foo.url >&- || git remote add foo
git是用来处理封闭fd的,因此您不需要>/dev/null
,只需关闭它,当您要求不存在的config时,config设置返回码。
答案 1 :(得分:1)
我正在考虑对git remote的输出进行grepping,但是有没有 更好的方法?
您可以使用命令退出代码。
如果遥控器不存在:
$ git remote add foo https://example.net
$ echo $?
0
如果遥控器已经存在:
$ git remote add foo https://example.net
fatal: remote foo already exists.
$ echo $?
128
编辑:
这很腥,但我认为它可以满足您的要求:
$ grep -q '\[remote "foo"\]' .git/config || git remote add foo https://example.net
答案 2 :(得分:1)
使用git remote show <remote>
:
$ git remote show origin && echo ok || echo err
* remote origin
Fetch URL: …
Push URL: …
HEAD branch: master
Remote branch:
master tracked
Local branch configured for 'git pull':
master rebases onto remote master
Local ref configured for 'git push':
master pushes to master (up to date)
ok
$ git remote show xxx && echo ok || echo err
fatal: 'xxx' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
err
答案 3 :(得分:1)
2019年建议的另一个答案:
如果遥控器已经存在:
$ git remote add foo https://example.net fatal: remote foo already exists. $ echo $? 128
随着Git 2.30(Q1 2021)的确发生了变化:退出代码来自“ git remote add/rename
” (man)
无法被脚本调用者使用。
请参见commit 9144ba4的Ævar Arnfjörð Bjarmason (avar
)(2020年10月27日)。
(由Junio C Hamano -- gitster
--在commit ecf95d9中合并,2020年11月9日)
remote
:在缺少/存在的地方添加有意义的退出代码签名人:ÆvarArnfjörðBjarmason
将“
git remote add/rename
”之类的退出代码更改为(man),如果所涉及的遥控器不存在,则以2退出;如果不存在,则以3退出。做。在我们只die()
并退出并使用一般的128退出代码之前。这会更改输出消息,例如:
fatal: remote origin already exists.
收件人:
error: remote origin already exists.
我相信这是一个功能,因为对于一般错误,我们通常使用“致命”,对于带有自定义退出代码的更具体的错误,则使用“错误”,但是更改的这一部分可能会破坏已经依赖的代码stderr解析(不是我们曾经支持过……)。
这样做的动机是围绕GitLab的gitaly中的一些代码进行讨论,这些代码想检查一下,并且必须解析stderr才能这样做:https://gitlab.com/gitlab-org/gitaly/-/merge_requests/2695
值得一提的是,一种不依赖于此的检查方法是使用“
git config
” (man)检查该值问题是否存在。这就引入了TOCTOU
race condition,但是另一方面,此代码(例如“git remote add
(man))已经有了TOCTOU
种族。 / p>我们通过config.lock进行配置的实际设置,但是伪代码逻辑为:
read_config(); check_config_and_arg_sanity(); save_config();
例如如果在
sleep()
检入remote_is_configured()
之后立即添加了add()
,我们将破坏remote.NAME.url
,并添加另一个(通常是重复的)remote.NAME.fetch
条目(以及其他值,取决于调用)。
git remote
现在包含在其man page中:
退出状态
成功后,退出状态为
0
。当诸如'
add
','rename
'和'remove
'之类的子命令找不到 处于有问题的远程状态,退出状态为2
。
当遥控器已经存在时,退出状态为3
。在发生任何其他错误时,退出状态可以是任何其他非零值。
答案 4 :(得分:0)
Grep 为 git 远程名称,仅当它不存在时才添加它。然后就可以放心的更新远程url了:
git remote -v | grep -w foo || git remote add foo https://example.net
git remote set-url foo https://example.net
或者,如果您更喜欢单线:
git remote -v | grep -w foo && \
git remote set-url foo https://example.net || \
git remote add foo https://example.net