2017-01-25 92 views
0

某些git命令是关于io重定向的备注,例如git bundle。我怀疑这与使用的底层“管道”命令有关。有关于IO redirection的一个很好的教程,以及与git commands有关的类似问题。但是,该解决方案不适用于所有 git命令,例如。 git bundle不尊重io重定向的git命令

例如。

$ /usr/bin/git bundle create /tmp/backup.bundle --all >/tmp/backup.txt 2>&1 
$ ls -al /tmp 
-rw-rw-r-- 1 myuser mygroup 4329 Jan 25 10:46 backup.bundle 
-rw-rw-r-- 1 myuser mygroup  0 Jan 25 10:46 backup.txt 

然而,在命令行中我可以看到有一些有趣的输出:

$ /usr/bin/git bundle create /tmp/backup.bundle --all 
Counting objects: 6, done. 
Compressing objects: 100% (6/6), done. 
Writing objects: 100% (6/6), 4.11 KiB | 0 bytes/s, done. 
Total 6 (delta 0), reused 0 (delta 0) 

那么,为什么我不能用IO重定向抓住这个?输出在哪里?

+0

在这样做时,会发生什么'在/ usr /斌/ git的束创建/tmp/backup.bundle --all> /tmp/backup.txt 2>&1'?它不是写入文件,而是写入'stdout'? – Inian

+0

对不起,错字 - 'backup.txt'被创建为一个空文件,即。没有输出收集(意想不到)并没有什么被打印在'stdout'或'stderr'到终端(如预期)@Inian –

回答

2

它无处不在 - 或者更确切地说,Git并不是首先打印它。

不同的Git命令有-v--verbose选项和-q--quiet选项。 Verbose使他们能够打印诸如计数,压缩和书写对象等东西。安静使他们不打印这样的事情。但是,默认将检查文件描述符上的isatty()结果,并根据结果设置或清除详细选项。

这意味着当您重定向输出(或使用来自Python subprocess管道的命令)时,它们默认为安静或至少非冗长。 (安静可抑制超过冗长打开。)

,有时可通过添加明确-v,例如,git fetch -v捕捉详细的输出,但有至少git fetch了一个小错误就无法传递给选项它运行的一些子命令,所以这不适用于所有情况(几周前我浪费了几个小时)。

git bundle命令首先缺少-v选项,因此您无法对其进行设置。通过使用pty运行命令可以获得详细输出,因此isatty()说“是的,这个I/O设备是一个tty”。 sh module可以做到这一点,虽然我没有使用它自己。

+0

有趣,'GIT中-v ...'生产:'未知的选项:-v 用法: GIT中[--version] [--help] ...',和使用'GIT中--verbose ...'生产:'未知的选项:--verbose 用法:GIT中[--version] [--help] ...'...我没有找到适用于我的命令行'git -C“$ {dir}”bundle create“$ {dest}”--all'的详细选项。因此,不一致的,复杂的......也许它只是我的版本:Git版本2.1.0 –

+0

哎呀,我的一部分坏的隐含位:这不是'混帐-v'但'git的克隆-v','混帐取-v',等等。 'git bundle'似乎根本没有'-v'。如果这是* *前端选项,可能是好的,(一拉'-C path'为例),它复制到环境变量:将修复bug和'GIT中获取-v',我碰到了,例如。但事实并非如此。 – torek

0

git bundle将其输出打印到stderr流。但是,只有当stderr流是TTY,我才会这样做。即基本上是一个互动控制台如果不是,但是有一些管道或文件,那么你观察它时没有打印任何内容。

您可以通过使用script实用程序来欺骗此检查,该实用程序将终端会话或命令记录到文件中。所以你的情况做

script --return --command '/usr/bin/git bundle create /tmp/backup.bundle --all' /tmp/backup.txt 

,你将有文件/tmp/backup.txt输出。如果你再看看它,你也会看到为什么这个支票在那里。 (扰流板:这是定期更新,覆盖进度信息,这当然不能正常工作,如果你没有一个TTY看这个。)

免责声明:这个答案适用于* nix系统也适用于Windows上的Cygwin。我不知道有关Windows平原的Git,在script工具可能无法提供有默认情况下,你可能必须寻找一个Windows端口或同等学历,或使用Cygwin做到这一点。