我正在编写自动脚本。
在某些时候,我正在呼叫git clone <repo>
。但是这个操作有可能已经完成。
如何调用git clone --no-fail
以便忽略存储库?
由于
答案 0 :(得分:16)
最稳定的解决方案就是让它失败。
您可以执行以下操作:
if [ ! -d "$FOLDER" ] ; then
git clone "$URL" "$FOLDER"
fi
但这很容易受到竞争条件的影响。
答案 1 :(得分:8)
派对有点晚了,但是我正在做类似的事情,但我想确保回购是最新的,如果它已经存在,那么为了扩大上述答案如果回购已经存在你可以拉,以确保它的最新的。
if [ ! -d "$FOLDER" ] ; then
git clone $URL $FOLDER
else
cd "$FOLDER"
git pull $URL
fi
答案 2 :(得分:1)
你没有告诉我们为什么它可能已存在或任何背景。
我非常想在[ -e $folder ] && rm -rf $folder
之前添加$folder
(确保git clone
是理智的),因为我不希望我的软件使用任何恰好存在的旧文件夹谁知道哪个州......
答案 3 :(得分:1)
git clone $url || true
会使set -e
的{{1}}的shell运行在git clone
失败后失败。
如果这不是您想要的,那么建议的目标目录的显式测试解决方案应该可以使用。
他们唯一的问题是,您需要模拟Git的方法来确定其名称。
这样的事情应该有效:
url=git://host/path/name.git
last=${url##*/}
bare=${last%%.git}
test -e "$bare" || git clone "$url"
那些&#34;技巧&#34; ##
和%%
为standard featues of the "parameter expansion" rules of POSIX shells。
答案 4 :(得分:1)
它使回购最新。
git -C "$TARGET_DIR" pull || git clone https://github.com/<repo>.git "$TARGET_DIR"
答案 5 :(得分:0)
git clone
中没有任何选项可以避免在克隆已经存在的情况下进行克隆。最好的选择是:
[ ! -d 'MyRepo' ] && git clone https://github.com/Myorg/MyRepo.git
答案 6 :(得分:0)
在 Git 2.30.1(2021 年第一季度)中,文档清楚地说明了多个并发 git clone
的竞争条件风险:
请参阅 commit a4a1ca2 的 Taylor Blau (ttaylorr
)(2021 年 1 月 11 日)。
(于 2021 年 1 月 15 日在 Junio C Hamano -- gitster
-- 被 commit 8782bfb 合并)
Documentation/git-clone.txt
:与 --local建议人:Junio C Hamano
签字人:Taylor Blau
运行'git clone --local
'(man)时,如果另一个进程正在修改源存储库,操作可能会失败。
记录这种已知的竞争条件,希望能帮助任何可能遇到它的人。
git clone
现在包含在其 man page 中:
注意:此操作可以与并发修改竞争
源存储库,类似于在修改时运行 cp -r src dst
src
。