2017-01-25 33 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做到這一點。