我正在尝试改进我的 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 clone --progress --branch $TAG_VERSION https://github.com/$REPO ./ 2>&1 | tr '\u000D' '\n'"
你的命令对我有用。它输出类似“- 克隆到存储库...远程...”的内容。我猜你的系统由于输出缓冲而无法捕获输出。
尝试在每条记录后打开刷新(将
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)
如果您使用
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 日)。
gitster
-- 合并于 commit b3049bb,2024 年 1 月 12 日)
:使write-or-die
成为布尔环境变量GIT_FLUSH
签字人:Chandra Pratap
Git 的环境变量中,标记为“Boolean”的变量以类似于布尔配置变量的方式接受值,即
“yes”、“on”、“true”和正数等值被视为“on”,“no”、“off”、“false”等值被视为“off”。可用于强制 Git 在写入 stdout 时使用非缓冲 I/O。GIT_FLUSH
它只能接受两个值,“1”会导致 Git 更频繁地刷新,“0”会使所有输出被缓冲。
通过将其转换为布尔环境变量,修改所需的逻辑,使接受除“0”和“1”之外的更多值。GIT_FLUSH
更新相关文档。
git
现在包含在其 手册页中:
如果此布尔环境变量设置为 true,则执行这样的命令
git
现在包含在其 手册页中:
变量设置为 false,这些命令的输出将完成
所以:
done < <(GIT_FLUSH=on stdbuf -i0 -o0 -e0 git clone --progress "$repo" 2>&1)
也可以。