如果没有本地的话,用克隆拉取的Git快捷方式?

g0czyy6m  于 2023-03-28  发布在  Git
关注(0)|答案(8)|浏览(384)

有没有一个单一的命令方式来获取远程存储库的最新镜像?

  • 如果本地存储库还不存在:无性系
  • 如果它在那里:拉力

我知道我可以编写脚本(例如if [ -d repo ]; then (cd repo && git pull); else git clone $repourl;fi),但我需要最简单的跨平台方式(实际上用于Jenkins-CI,我知道它默认这样做,但我需要2个repos,对它的支持有限)。
Git在其他方面也有类似的快捷方式(例如checkout -B和pull itself),所以我想知道我是否错过了什么。谢谢!

cidc1ykv

cidc1ykv1#

没有,因为对现有仓库进行操作的命令都假设它们在给定的仓库中运行。
也就是说,如果你在shell中运行,你可以简单地使用shell内置程序。例如,下面是bash:

if cd repo; then git pull; else git clone https://server/repo repo; fi

这将检查repo是否是一个有效的目录,如果是,则在其中执行pull;否则它执行clone来创建目录。

pw9qyyiw

pw9qyyiw2#

最简洁的一行程序可能是

git -C repo pull || git clone https://server/repo repo
5ktev3wc

5ktev3wc3#

git -C repo pull只适用于git 1.8.5及以上版本,早期版本可以尝试:

remote_repo=https://server/repo
local_repo=repo

if [ -d $local_repo/.git ]; then pushd $local_repo; git pull; popd; else git clone $remote_repo; fi
tez616oj

tez616oj4#

如果无法升级git,并且您不想为repo传递参数,则脚本方法可以是:

#!/bin/bash

function clone_pull {
  DIRECTORY=$(basename "$1" .git)
  if [ -d "$DIRECTORY" ]; then
    cd "$DIRECTORY"
    git pull
    cd ../
  else
    git clone "$1"
  fi
}

clone_pull https://github.com/<namespace>/<repo>
# or
clone_pull git@github.com:<namespace>/<repo>.git
6pp0gazn

6pp0gazn5#

git pull知道从哪里拉取,因为本地仓库在其本地配置中注册了一个远程仓库。它从一个工作树中操作。
但是git clone没有,它必须有一个显式的远程URL传入参数才能克隆。它在工作树之外操作。
这种快捷方式 * 不 * 存在的主要原因是:

  • 对于给定的repo,你很少使用git clone:它是存储库生命周期中的一次性命令。

另外,它可能需要 * 一个额外的 * 命令才能完成:例如,如果您有子模块,则需要添加git submodule update --init

  • git pull本身就是一个快捷方式(对于git fetch + git merge)。甚至git pull --rebase也是git fetch + git rebase的另一个快捷方式。

考虑到您要使用git clone的次数,这样的快捷方式不是一个高优先级。
因此,脚本仍然是定义所需内容的最可靠方法。

baubqpgj

baubqpgj6#

幂等git-clone有合理的用例(特别是在脚本化的情况下)。
这里有现成的实现(需要Node.js):git-clone-idempotent

$ nvm install node ## if you have nvm but not node/npm
$ npm install -g git-clone-idempotent

$ git-clone-idempotent repo [folder]

这种方法可能比基于shell脚本的解决方案更具有OS可移植性。

afdcj2ne

afdcj2ne7#

既然你提到了Jenkins,就可以使用Jenkins SCM API进行克隆或拉取。checkout方法正是你想要的。
你可以像这样从groovy脚本运行它:

dir (targetFolder) {
  checkout(scm: [$class: 'GitSCM', branches: [[name: 'master']], ...])
}

请注意,它并没有 checkout git意义上的指定分支,而是在相应的提交时将工作区留在一个分离的头上。

kh212irz

kh212irz8#

这里是另一个1行代码。与这里的其他解决方案相比,此代码不会在终端中输出错误:

(test -d my-repo && git -C my-repo pull --rebase) || \
  git clone https://github.com/my-repo my-repo

下面是一个变体,其中repo和源URL是变量,因此您不需要重复repo-folder三次:

DIR=my-repo && ORIGIN=https://github.com/my-repo/ && \
  (test -d $DIR && git -C $DIR pull --rebase) || git clone $ORIGIN $DIR

相关问题