2013-07-03 34 views
5

這很奇怪。我正在嘗試製作一個腳本,用於檢查每個本地分支,並將它們放在原始/主標記上。`git分支--list`返回文件?

所以這是我的腳本:

for br in `git branch -l`; do 
    git checkout $br 
    git rebase origin/master 
done 

簡單。但在我編寫腳本之前,我想確保`git branch -l`返回我認爲它正在返回的內容.....事實並非如此。

git branch -l返回正確的結果。但`git branch -l`實際上是返回所有本地分支PLUS當前目錄中的文件!

它返回它是這樣的:

[list of local branches minus master] [list of files in the current dir] master 

`的Git分支--list`的工作方式。

這是怎麼發生的?

有沒有更好的方法來重新組織起源/大師到所有地方分支機構?

+0

你真的不應該在這樣的問題中使用你的自定義別名:/ –

+0

只是一個小小的評論:我相信你實際上正在做的是將所有分支重定位到主,而不是其他方式(只是一個符號的問題) – pgilmon

回答

9

這是一種愚蠢的事情。

git分支--list在當前選定的分支前面放置一個星號;你的shell腳本會將其解釋爲通配符,並將當前目錄中的文件添加到要用for循環遍歷的項目列表中。

您可以嘗試

for br in `git branch -l | tr '*' ' '`; do 
    git checkout $br 
    git rebase origin/master 
done 
+0

反病毒軟件,對於沒有別人分支的人,請在你的回答中用分支替換br。我知道你的劇本可以爲Nacht工作,但考慮一下其他人的看法。我給了你一個投票,因爲它回答了Nacht的問題。另外考慮修改co來結賬。謝謝! – cforbish

+0

@cforbish - 好點,我做了改變 – antlersoft

2

其他的事情可以做,在這裏不是真正需要但更強大的腳本很有用,因爲它是,是用git for-each-ref提取你想要的refnames。例如,中git branch --list相當於去掉前綴空白,或加星號是:

$ git for-each-ref refs/heads/ --format='%(refname:short)' 

如下例:

$ git branch -a 
* master 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/master 
$ git for-each-ref refs/heads/ --format='%(refname:short)' 
master 

同樣可以得到遙控器(git branch -r)通過使用refs/remotes/代替refs/heads/,你可以使用refs/tags/找到標籤。 for-each-ref甚至還有一些額外選項,旨在保護字符串免受各種程序操作的影響(在這種情況下不需要,請參閱git check-ref-format的文檔及其對分支名稱的限制),但可以在git for-each-ref的輸出上使用eval