2016-10-19 4 views
0

私は私の.gitconfigファイルに次のコードを持っています。基本的には、リモートサーバー上のすべてのブランチを引くためaliasを作成している複数のコマンドが動作していない

[alias] 
    john = "!f(){ git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done; git fetch --all; git pull --all; };f" 

。しかし、常に間違いが起きています。誰かが私が間違っていることを理解するのを助けることができる、私はコマンドを解剖しようとしましたが、何がうまくいかないのを見つけることができません。

+1

エラーは何ですか? –

+0

あなたのコマンドの外側の区切り文字として一重引用符( '' 'の代わりに' '' ')を使用しようとしましたか、文字列の中にダブルクォート(' ''の代わりに '' '*)*をエスケープしてみましたか? – LeGEC

答えて

0

埋め込みの二重引用符をバックスラッシュでエスケープする必要があります。例えば:

[alias] 
    next = "!f() { id=$(git rev-list --reverse --ancestry-path ..master | head -1); test -n \"$id\" && git checkout $id || echo 'no more commits'; }; f" 

(私は実際にmasterをハードコーディングするのでコメントアウトしている偽です:これはthis answerから残っています)。

next = "!f() { \ 
     id=$(git rev-list --reverse --ancestry-path ..master | head -1); \ 
     test -n \"$id\" && git checkout $id || echo 'no more commits'; }; f" 

(未テストが、動作するはずです):

また、バックスラッシュ、改行で長い行を折り返すことができます。

言ったことすべてが、これは間違っている:基本的には、リモートサーバー上のすべてのブランチを引っ張っのエイリアスを作成している

あなたはrefs/remotes/origin/zorgrefs/remotes/evil/zorgの両方を持っている場合あなたのサンプルの別名を使用すると、完全に一般に可能でない限り、それが行くように細かいですが、それぞれのリモート追跡ブランチ(例えばための新しいローカルブランチを作成しようローカルブランチzorgは両方のリモートトラッキングブランチを追跡できません)。 からフェッチするすべてのリモートfetchデフォルトからフェッチを意味し、その後、あなたはgit fetch --allを実行し、(スクリプトの目的のために、それはここgit for-each-refを使用することをお勧めしますが、既存のループはあなたの目的のために十分に機能するはずです。)

しかし、現在のブランチのリモートとはかなりゆるやかに定義されている「現在の」リモート、または現在のブランチにリモートセットがない場合はoriginとなります)。git pull --allを実行して--allからgit fetchに再度渡し、設定されたremoteおよびmergeの設定に基づいて、現在のブランチを変更(またはリベース)します。

したがって、ループで作成したブランチの1つがに更新されます。

各ローカルブランチをマージまたはリベースするには、ローカルブランチをループする必要があります(もう一度、好ましくはgit for-each-refを使用します)。

+0

ありがとう、それは魅力のように働いた:)大きな説明も! – gespinha

関連する問題