【发布时间】:2016-07-29 16:20:11
【问题描述】:
我正在编写一个自动化脚本。
在某个时候,我会打电话给git clone <repo>。但是这个操作有可能已经完成了。
如果存储库存在,我如何调用git clone --no-fail 使其忽略?
谢谢
【问题讨论】:
我正在编写一个自动化脚本。
在某个时候,我会打电话给git clone <repo>。但是这个操作有可能已经完成了。
如果存储库存在,我如何调用git clone --no-fail 使其忽略?
谢谢
【问题讨论】:
最稳定的解决方案是让它失败并打印错误消息。如果您认为这对您的场景来说太丑陋了,您可以将其重定向到 /dev/null:
folder="foo"
if ! git clone "${url}" "${folder}" 2>/dev/null && [ -d "${folder}" ] ; then
echo "Clone failed because the folder ${folder} exists"
fi
否则你可以这样做:
if [ ! -d "$FOLDER" ] ; then
git clone "$URL" "$FOLDER"
fi
但这很容易受到竞争条件的影响。
【讨论】:
mkdir -p 的行为。感谢您的回答
聚会有点晚了,但我正在做类似的事情,但我想确保如果回购已经存在,那么它是最新的,因此如果回购已经存在,那么扩展上述答案,然后你可以拉动以确保它是是最新的。
if [ ! -d "$FOLDER" ] ; then
git clone $URL $FOLDER
else
cd "$FOLDER"
git pull $URL
fi
【讨论】:
git clone $url || true 将使运行 set -e 的 shell 在 git clone 失败时不会失败。
如果这不是您想要的,那么建议的解决方案对已经存在的目标目录进行显式测试应该可以工作。
他们唯一的问题是你需要模拟 Git 的方法来找出它的名字。
这样的事情应该可以工作:
url=git://host/path/name.git
last=${url##*/}
bare=${last%%.git}
test -e "$bare" || git clone "$url"
## 和%% 的“技巧”是standard featues of the "parameter expansion" rules of POSIX shells。
【讨论】:
它使 repo 最新。
git -C "$TARGET_DIR" pull || git clone https://github.com/<repo>.git "$TARGET_DIR"
【讨论】:
如果克隆已经存在,git clone 中没有用于避免克隆的选项。您最好的选择是:
[ ! -d 'MyRepo' ] && git clone https://github.com/Myorg/MyRepo.git
【讨论】:
你没有告诉我们为什么它可能已经在那里,或者任何上下文。
我非常想在git clone 之前添加一个[ -e $folder ] && rm -rf $folder(确保$folder 正常),因为我不希望我的软件使用任何旧文件夹,而这些旧文件夹恰好位于那里,谁知道是哪个状态...
【讨论】:
rm -rf 方法很有趣。但理想情况下,如果文件夹存在且相同,则不会重复克隆操作。
使用 Git 2.30.1(2021 年第一季度),文档清楚地说明了多个并发 git clone 的竞争条件风险:
参见Taylor Blau (ttaylorr) 的commit a4a1ca2(2021 年 1 月 11 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 8782bfb,2021 年 1 月 15 日)
Documentation/git-clone.txt: 使用 --local 记录竞赛推荐人:Junio C Hamano
签名人:Taylor Blau
运行 '
git clone --local'(man) 时,如果另一个进程正在修改源存储库,则操作可能会失败。
记录这种竞争条件,希望能帮助任何可能遇到它的人。
git clone 现在包含在其man page 中:
注意:此操作可能与同时修改 源存储库,类似于在修改时运行
cp -r src dstsrc.
【讨论】: