2016-06-07 106 views
3

當我運行的git克隆像往常一樣,我看到:如何將`git clone`的完整輸出重定向到一個文件?

$ git clone https://github.com/bensmithett/webpack-css-example 
Cloning into 'webpack-css-example'... 
remote: Counting objects: 179, done. 
remote: Total 179 (delta 0), reused 0 (delta 0), pack-reused 179 
Receiving objects: 100% (179/179), 24.07 KiB | 0 bytes/s, done. 
Resolving deltas: 100% (79/79), done. 
Checking connectivity... done 

然而,當我試圖將其重定向到一個文件,我只看到這一點:

Cloning into 'webpack-css-example'... 

這裏是我的嘗試:

$ git clone https://github.com/bensmithett/webpack-css-example 2>&1 | tee out.log 
$ cat out.log 
Cloning into 'sample-data'... 

我在Node.js的試了一下爲好,它做同樣的事情:

const fs = require('fs'); 
const child = spawn('git clone https://github.com/bensmithett/webpack-css-example'); 
child.stdout.on('data', function(data){ 
    console.log(String(data)); 
}); 
child.stderr.on('data', function(data){ 
    console.log(String(data)); 
}); 
// Cloning into 'webpack-css-example'... 

爲什麼所有的remote:等東西沒有通過管道連接到stdin/stderr?有什麼方法可以捕獲輸出嗎?如果沒有,發生了什麼事情使得輸出顯示在終端中,但它沒有通過stdout或stderr傳遞?

回答

6

默認情況下,僅當標準錯誤流指向終端時,Git纔會顯示克隆進度。由於您將其重定向到管道,輸出流不再連接到終端。因此,爲了捕獲輸出,您需要添加--progress參數來強制執行進度狀態,例如,

git clone --progress https://github.com/foo/bar 2> out.log 

參見:man git-clone

--progress

進展狀態被默認報告了標準錯誤流,當它被連接到末端,除非指定-q。即使標準錯誤流未定向到終端,此標誌也會強制進度狀態。


要強迫任何其他方式的終端,你就必須預裝一些庫強制isatty()總是返回true(參見:man isatty)。這個函數被git使用,通過source code

+0

有沒有辦法「假裝」它是運行命令的終端?這樣該命令可以在不改變其參數的情況下運行。這正是我所希望的,git只是一個例子。 –

+0

@LancePollard,不是沒有額外的工具,如「unbuffer」。 –

+0

@CharlesDuffy你如何做到這一點? –