如何通过管道进行 git 克隆

问题描述 投票:0回答:4

我正在尝试改进我的 CI 工具,为此我正在尝试捕获 git clone 命令的输出,这让我发疯。

为了简化场景,我将问题简化为这个简单的命令:

git clone --progress https://github.com/$REPO.git $FOLDER 2>&1 | xargs echo  -

使用

2>&1
,我将stderr(由git使用来输出进度)重定向到stdout,然后我尝试将其通过管道传输到
xargs echo -
。在我的现实生活场景中
xargs echo
将被其他东西取代。

我使用 --progress 是为了强制 git 变得冗长,即使它没有连接到真正的控制台。

我的预期输出是:

- Cloning into 'a3'...
- remote: Counting objects: 54130, done.
- remote: Compressing objects: 100% (520/520), done.

我的输出完全没有。 我正在 OSX 10.11 上测试这个。

有人知道这个命令有什么问题吗?

提前谢谢您非常

git bash unix pipe posix
4个回答
1
投票

我通过使用解决了这个问题

git clone --progress --branch $TAG_VERSION https://github.com/$REPO ./ 2>&1 | tr '\u000D' '\n'"

0
投票

你的命令对我有用。它输出类似“- 克隆到存储库...远程...”的内容。我猜你的系统由于输出缓冲而无法捕获输出。

尝试在每条记录后打开刷新(将

GIT_FLUSH
环境变量设置为
1
)。另外,关闭
git clone
命令的缓冲:

repo='your-repo-uri'

while read -r l; do
  echo "<<<<<<<<<<"
  echo "$l"
  echo ">>>>>>>>>>"
done < <(GIT_FLUSH=1 stdbuf -i0 -o0 -e0 git clone --progress "$repo" 2>&1)

0
投票

您可以使用这个:

git clone --progress url > clone.txt 2>&1

技巧是添加

2>&1
作为命令的最后一个参数。
它将打印出所有命令,因为它们本来会打印到终端,但现在它们被写入所需的文件。


0
投票

如果您使用

GIT_FLUSH
,如Ruslan Osmanov答案;确保使用 Git 2.44(2024 年第 1 季度):与使用通常的
true/false/yes/no
以及
0/1
的其他环境变量不同,
GIT_FLUSH
只理解
0/1
。已修复此问题

请参阅 Chandra Pratap (Pratapchandradeo)

commit 556e680(2024 年 1 月 4 日)。
(由 Junio C Hamano --
gitster
--
合并于 commit b3049bb,2024 年 1 月 12 日)

write-or-die
:使
GIT_FLUSH
成为布尔环境变量

签字人:Chandra Pratap

Git 的环境变量中,标记为“Boolean”的变量以类似于布尔配置变量的方式接受值,即
“yes”、“on”、“true”和正数等值被视为“on”,“no”、“off”、“false”等值被视为“off”。

GIT_FLUSH
可用于强制 Git 在写入 stdout 时使用非缓冲 I/O。
它只能接受两个值,“1”会导致 Git 更频繁地刷新,“0”会使所有输出被缓冲。
通过将其转换为布尔环境变量,修改所需的逻辑,使
GIT_FLUSH
接受除“0”和“1”之外的更多值。
更新相关文档。

git
现在包含在其 手册页中:

如果此布尔环境变量设置为 true,则执行这样的命令

git
现在包含在其 手册页中:

变量设置为 false,这些命令的输出将完成

所以:

done < <(GIT_FLUSH=on stdbuf -i0 -o0 -e0 git clone --progress "$repo" 2>&1)
也可以。

© www.soinside.com 2019 - 2024. All rights reserved.