2015-11-04 40 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”语法,我只是想知道是否有什么明显的我失踪了。显然不是。 –