2015-11-04 71 views
2

我試圖在PowerShell中運行以下命令:防止PowerShell與「拳」節目輸出

git log --cherry-pick master...branch --format=%h | git cherry-pick -n --stdin 

git log得到承諾哈希,然後我想傳遞給git cherry-pick的換行分隔列表。然而,git cherry-pick總是抱怨:

'atal: bad revision '12abcdef 

其中12abcdefgit log返回的第一道防線。請注意,上面是而不是一個錯字 - 輸出真的是這樣的損壞。

問題似乎是,PowerShell正在將git log輸出轉換爲一個字符串數組,然後嘗試將其傳輸到git cherry-pick,因爲它不知道PS對象;它只是希望stdin的原始文本。我猜這與我上面看到的損壞輸出有關,但我不確定。

如果我通過cmd.exegit bash運行相同的命令,一切都按預期工作。我試過git log輸出上的各種PS命令,試圖讓它保持原始狀態(join,out-string等),但沒有任何工作。所以,有沒有辦法告訴PowerShell單獨離開stdout(即讓它成爲「原始」),或者我做錯了什麼,或者是否有PowerShell-y的方式,我應該這樣做,這將會給我想要的結果?

+0

將輸出輸出到'cat -A'而不是'git',你會看到問題。 DOS行結尾。我不知道如何解決這個問題。 –

+1

個人我只會'cmd/c'git log --cherry-pick master ... branch --format =%h | git cherry-pick -n --stdin''。 – PetSerAl

回答

2

假設git log --cherry-pick作品像我期望它,最PowerShell的喜歡的方式來做到這一點很可能是這樣的:

foreach ($cherry in $(git log --cherry-pick master...branch --format=%h)) { 
    git cherry-pick -n $cherry 
} 

或者這樣:

git log --cherry-pick master...branch --format=%h | ForEach-Object { 
    git cherry-pick -n $_ 
} 

或者,如果你必須是簡潔的:

git log --cherry-pick master...branch --format=%h | % { git cherry-pick -n $_ } 

我懷疑有一種方法可以用管道這非常乾淨,因爲Unix管道是字符流,而PowerShell管道是對象。您無法改變PowerShell中管道操作員的工作方式。

+0

「Unix流水線是字符流,而PowerShell流水線是對象,你無法改變PowerShell中管道操作符的工作方式」 - 我想到了很多,而且我已經知道了「Foreach-Object」語法,我只是想知道是否有什麼明顯的我失蹤了。顯然不是。 –