有没有一个单一的命令方式来获取远程存储库的最新镜像?
- 如果本地存储库还不存在:无性系
- 如果它在那里:拉力
我知道我可以编写脚本(例如if [ -d repo ]; then (cd repo && git pull); else git clone $repourl;fi
),但我需要最简单的跨平台方式(实际上用于Jenkins-CI,我知道它默认这样做,但我需要2个repos,对它的支持有限)。
Git在其他方面也有类似的快捷方式(例如checkout -B和pull itself),所以我想知道我是否错过了什么。谢谢!
8条答案
按热度按时间cidc1ykv1#
没有,因为对现有仓库进行操作的命令都假设它们在给定的仓库中运行。
也就是说,如果你在shell中运行,你可以简单地使用shell内置程序。例如,下面是bash:
这将检查
repo
是否是一个有效的目录,如果是,则在其中执行pull
;否则它执行clone
来创建目录。pw9qyyiw2#
最简洁的一行程序可能是
5ktev3wc3#
git -C repo pull
只适用于git 1.8.5及以上版本,早期版本可以尝试:tez616oj4#
如果无法升级git,并且您不想为repo传递参数,则脚本方法可以是:
6pp0gazn5#
git pull
知道从哪里拉取,因为本地仓库在其本地配置中注册了一个远程仓库。它从一个工作树中操作。但是
git clone
没有,它必须有一个显式的远程URL传入参数才能克隆。它在工作树之外操作。这种快捷方式 * 不 * 存在的主要原因是:
git clone
:它是存储库生命周期中的一次性命令。另外,它可能需要 * 一个额外的 * 命令才能完成:例如,如果您有子模块,则需要添加
git submodule update --init
。git pull
本身就是一个快捷方式(对于git fetch
+git merge
)。甚至git pull --rebase
也是git fetch
+git rebase
的另一个快捷方式。考虑到您要使用
git clone
的次数,这样的快捷方式不是一个高优先级。因此,脚本仍然是定义所需内容的最可靠方法。
baubqpgj6#
幂等git-clone有合理的用例(特别是在脚本化的情况下)。
这里有现成的实现(需要Node.js):git-clone-idempotent
这种方法可能比基于shell脚本的解决方案更具有OS可移植性。
afdcj2ne7#
既然你提到了Jenkins,就可以使用Jenkins SCM API进行克隆或拉取。
checkout
方法正是你想要的。你可以像这样从groovy脚本运行它:
请注意,它并没有 checkout git意义上的指定分支,而是在相应的提交时将工作区留在一个分离的头上。
kh212irz8#
这里是另一个1行代码。与这里的其他解决方案相比,此代码不会在终端中输出错误:
下面是一个变体,其中repo和源URL是变量,因此您不需要重复repo-folder三次: