仅在不存在时添加git remote

时间:2019-09-14 12:28:13

标签: git

脚本是否有一种简单的方法来检测是否已存在远程控制器,并仅在不存在时才添加远程控制器?水暖命令或瓷器标志?

在使用现有遥控器运行git remote add foo https://example.net时,我得到:

fatal: remote foo already exists.

理想情况下,会有--if-not-exists--update-if-exists之类的标记,但在documentation中找不到任何标记。

我正在考虑提取git remote的输出,但是有更好的方法吗?

5 个答案:

答案 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/renameman
无法被脚本调用者使用。

请参见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 configman检查该值问题是否存在。这就引入了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