将git包创建输出重定向到日志文件

nfg76nw0  于 2023-04-28  发布在  Git
关注(0)|答案(2)|浏览(145)

我正在使用Windows 7,32位,git版本2。12.0.windows.1.
我正在编写一个简单的批处理脚本,将git仓库捆绑到一个唯一的文件中。我想将命令的输出重定向到一个日志文件,然后我可以检查,但我遇到了一个我无法理解的行为。
在任何git仓库中,如果我运行以下命令:

git bundle create bundle.out --all > bundle.log

我希望命令的输出被重定向到file bundle。但是,在运行命令后,文件 * 捆绑。log 被创建,但它是空的,并且输出显示在控制台上,就像没有应用重定向一样。因此,我尝试重定向错误流:

git bundle create bundle.out --all 1> bundle.log 2> error.log

同样在本例中,创建了bundle,即两个file bundle。log 和 * 错误。log* 已创建,但它们为空。奇怪的是,控制台上没有显示任何输出。所以,我的问题是,这个输出在哪里消失?
为了比较,我尝试了另一个“类似”的命令,即:

git bundle verify bundle.out 1> stream1.log 2> stream2.log

应用于之前创建的bundle,行为是我所期望的:stream1.log 包含参考列表等和 stream2。log contained“bundle.“出来就好”。
我做错了什么?如何实现我的目标,即将git bundle create的输出重定向到日志文件?

91zkwejq

91zkwejq1#

stderr流不再是git bundle的唯一输出。
在Git 2.25(2020年第一季度)中,“git bundle”已被教导使用解析选项API,并作为其中的一部分,更好地管理其重定向。
git bundle verify“学习“--quiet“和“git bundle create“学习选项控制进度输出
参见commit e0eba64commit 79862b6commit 73c3253(2019年11月10日)by Robin H. Johnson ( robbat2 )
(由Junio C Hamano -- gitster --合并至commit ca5c8aa,2019年12月1日)

bundle-create:进度输出控制

在git-bundle的create子命令中支持pack-objects的进度输出选项。
最值得注意的是,这个provides --quiet作为requested on the git mailing list
这意味着git bundle文档现在包括:
--progress:(Git 2中只剩下一个。41,Q2 2023)
除非指定了-q,否则默认情况下,当标准错误流附加到终端时,会在标准错误流上报告进度状态。
即使标准错误流未定向到终端,此标志也强制执行进度状态。
--all-progress:(在Git 2中不再需要。41,Q2 2023)
指定--stdout时,在对象计数和压缩阶段显示进度报告,但在写出阶段禁止。
原因是在某些情况下,输出流直接链接到另一个命令,该命令可能希望在处理传入的包数据时显示其自己的进度状态。
这个标志类似于--progress,除了它也强制输出写阶段的进度报告,即使使用了--stdout
--all-progress-implied:(Git 2中默认为true。41,Q2 2023)
这用于在激活进度显示时暗示--all-progress
--all-progress不同,此标志本身实际上不会强制显示任何进度。
Git 2.41(Q2 2023)简化了UI,以控制由“git bundle“(man)命令给出的进度表。
参见commit 8b95521(2023年3月4日),作者Jeff King ( peff )
(由Junio C Hamano -- gitster --合并于commit 12201fd,2023年3月19日)

bundle:默认打开--all-progress-implied

签字人:杰夫·金
79862b6(“bundle-create:进度输出控制》,2019-11-10,Git v2。25.0-rc 0--batch #2中列出的merge),“bundle create”了解了从pack-objects复制的--all-progress--all-progress-implied选项。
我觉得这是个错误。
在pack-objects中,“all-progress-implied”是关于在常规的磁盘上“git repack”(man)和使用pack-objects进行push/fetch(其中fetch不希望在写入阶段从服务器进行;客户机将在其接收到数据时打印进度)。
但是对于bundle没有这样的区别。
79862b6之前,我们总是打印写入阶段。
之后,香草:

git bundle create foo.bundle

忽略写入进度,显示为挂起(特别是当存储库很大或磁盘很慢时)。
这似乎是一种倒退。
禁用写阶段进度的灵活性可能对bundle有用。
例如,如果您执行以下操作:

ssh some-host git bundle create foo.bundle |
git bundle unbundle

但是如果你同时实时运行这两个包,为什么你首先要使用bundle呢?你最好去捡真实的。
但即使我们确实想支持它,它也应该是例外,vanilla“bundle create”应该显示完整的进度。
所以我们想将选项命名为“--no-write-progress”或其他名称。
--all-progress”选项本身更糟糕。
它存在于pack-objects中只是由于历史原因。
这是一个错误,因为它意味着“--progress”,我们添加了“--all-progress-implied”来解决这个问题。
没有理由将该错误传播到新命令。
同样,这些选项的文档也是从pack-objects中提取的。
但在这种情况下这说不通。
它谈到了“--stdout”,但这甚至不是git-bundleman)支持的选项。
此补丁将“--all-progress-implied”的默认值翻转回“true”,修复了79862b6中的回归。
这将该选项变成一个noop,并意味着“--all-progress”实际上与“--progress”相同。
我们可以完全放弃它们,但因为它们从v2开始就随Git一起提供了。25.0,继续接受他们是礼貌的。
我在这里没有实现任何类型的“--no-write-progress“。
我完全不相信这是必要的,从original thread的讨论中可以看出,主要的焦点是获得--progress--quiet的支持,而不是任何聪明的“通过网络实时捆绑”功能。
但从技术上讲,这个补丁使它不可能做的事情,你可以做后79862 b6 b77 c。
git bundle现在在其手册页中包括:

git bundle create [-q | --quiet | --progress]

ohtdti5x

ohtdti5x2#

git bundle将其输出打印到stderr流。但是它仅在stderr流是TTY,i时这样做。即交互式控制台。如果不是,而是某个管道或文件,则不会打印任何内容。
您可以通过使用script实用程序来欺骗这种检查,该实用程序将终端会话或命令记录到文件中。所以在你的情况下

script --return --command 'git bundle create bundle.out --all' bundle.log

您将在文件bundle.log中获得输出。如果你看了它,你也会明白为什么这个支票在那里。(* 剧透:* 这是定期更新和覆盖的进度信息,这当然不能正常工作,如果你不看这个在TTY。)

**免责声明:**此答案适用于 *nix系统,也适用于Windows上的Cygwin。我不知道普通Git for Windows,script实用程序可能在默认情况下无法使用,你可能需要搜索Windows端口或等效端口,或者使用Cygwin来完成这一操作。

相关问题