我正在使用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
的输出重定向到日志文件?
2条答案
按热度按时间91zkwejq1#
stderr流不再是
git bundle
的唯一输出。在Git 2.25(2020年第一季度)中,“
git bundle
”已被教导使用解析选项API,并作为其中的一部分,更好地管理其重定向。“
git bundle verify
“学习“--quiet
“和“git bundle create
“学习选项控制进度输出。参见commit e0eba64,commit 79862b6,commit 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之前,我们总是打印写入阶段。
之后,香草:
忽略写入进度,显示为挂起(特别是当存储库很大或磁盘很慢时)。
这似乎是一种倒退。
禁用写阶段进度的灵活性可能对bundle有用。
例如,如果您执行以下操作:
但是如果你同时实时运行这两个包,为什么你首先要使用bundle呢?你最好去捡真实的。
但即使我们确实想支持它,它也应该是例外,vanilla“
bundle create
”应该显示完整的进度。所以我们想将选项命名为“
--no-write-progress
”或其他名称。“
--all-progress
”选项本身更糟糕。它存在于pack-objects中只是由于历史原因。
这是一个错误,因为它意味着“
--progress
”,我们添加了“--all-progress-implied
”来解决这个问题。没有理由将该错误传播到新命令。
同样,这些选项的文档也是从pack-objects中提取的。
但在这种情况下这说不通。
它谈到了“
--stdout
”,但这甚至不是git-bundle
(man)支持的选项。此补丁将“
--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]
ohtdti5x2#
git bundle
将其输出打印到stderr流。但是它仅在stderr流是TTY,i时这样做。即交互式控制台。如果不是,而是某个管道或文件,则不会打印任何内容。您可以通过使用
script
实用程序来欺骗这种检查,该实用程序将终端会话或命令记录到文件中。所以在你的情况下您将在文件
bundle.log
中获得输出。如果你看了它,你也会明白为什么这个支票在那里。(* 剧透:* 这是定期更新和覆盖的进度信息,这当然不能正常工作,如果你不看这个在TTY。)**免责声明:**此答案适用于 *nix系统,也适用于Windows上的Cygwin。我不知道普通Git for Windows,
script
实用程序可能在默认情况下无法使用,你可能需要搜索Windows端口或等效端口,或者使用Cygwin来完成这一操作。