15

変ですね。すべてのローカル ブランチをチェックアウトし、origin/master をそれにリベースするスクリプトを作成しようとしています。

だから、これは私のスクリプトです:

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

単純。しかし、スクリプトを作成する前に、「git branch -l」が返されると思われるものを返すことを確認したかったのですが、そうではありません。

git branch -l正しい結果を返します。しかし、`git branch -l` は実際にはすべてのローカル ブランチと現在のディレクトリ内のファイルを返します!

次のように返します。

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

`git branch --list` も同じように動作します。

なぜこうなった?

origin/master をすべてのローカル ブランチにリベースするより良い方法はありますか?

4

2 に答える 2

21

これはちょっとばかげたことです。

git branch --list は、現在選択されているブランチの前にアスタリスクを付けています。シェルスクリプトはそれをワイルドカードとして解釈し、現在のディレクトリ内のファイルを項目のリストに追加して、for ループでトラバースします。

あなたが試すことができます

for br in `git branch -l | tr '*' ' '`; do
    git checkout $br
    git rebase origin/master
done
于 2013-07-03T15:26:11.083 に答える
3

他にできることは、ここでは実際には必要ありませんが、いわばより堅牢なスクリプトに役立ちますが、 を使用して必要な参照git for-each-ref名を抽出することです。たとえば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-refgit check-ref-formatevalgit for-each-ref

于 2013-07-03T23:14:52.167 に答える