2016-11-08 58 views
4

我已經開始使用張貼在這一個腳本中另一個thread扭捏腳本來把所有的遙控器分支

#!/bin/bash 

main() { 
    REMOTES="[email protected]"; 
    if [ -z "$REMOTES" ]; then 
    REMOTES=$(git remote); 
    fi 
    REMOTES=$(echo "$REMOTES" | xargs -n1 echo) 
    CLB=$(git branch -l|awk '/^\*/{print $2}'); 
    echo "$REMOTES" | while read REMOTE; do 
    git remote update $REMOTE 
    git remote show $REMOTE -n \ 
    | awk '/merges with remote/{print $5" "$1}' \ 
    | while read line; do 
     RB=$(echo "$line"|cut -f1 -d" "); 
     ARB="refs/remotes/$REMOTE/$RB"; 
     LB=$(echo "$line"|cut -f2 -d" "); 
     ALB="refs/heads/$LB"; 
     NBEHIND=$(($(git rev-list --count $ALB..$ARB 2>/dev/null) +0)); 
     NAHEAD=$(($(git rev-list --count $ARB..$ALB 2>/dev/null) +0)); 
     if [ "$NBEHIND" -gt 0 ]; then 
     if [ "$NAHEAD" -gt 0 ]; then 
      echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded"; 
     elif [ "$LB" = "$CLB" ]; then 
      echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. fast-forward merge"; 
      git merge -q $ARB; 
     else 
      echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. reseting local branch to remote"; 
      git branch -l -f $LB -t $ARB >/dev/null; 
     fi 
     fi 
    done 
    done 
} 

main [email protected] 

它的偉大工程,到目前爲止,但我不知道如何調整它拉各分公司,爲某些原因,它不會拉某些地方分支機構。

第一個例子:我有4個當地分支機構落後於主是當前一個,運行此腳本幾枝(4)是對於偏遠落後被拔出後,但我仍然可以看到背後的主分支遠程像下面的圖片:

enter image description here

第二個例子:運行我得到這個腳本之前,落後2個當地分支機構和當前的(發行版)是好的:

enter image description here

我運行該腳本,我得到這個:

enter image description here

所以,我怎麼能調整到拉「所有」本地分支腳本?

+1

我只看到了'master'的分支作爲上拉後暫時落後。還有其他分支還在後面嗎? –

+0

@TimBiegeleisen我用2個例子更新了我的問題,希望澄清一下 – BPL

回答

1

此外to my previous answer,我想補充一點,你的腳本應該只限制特定分支的合併或復位到它的上游分支。
因此,我使用的%(upstream:track)

這裏我只是測試腳本:

  • Git版本2.11.0.windows.1
  • SourceTree 1.9.10。0

即:

#!/bin/bash 

branches=$(git for-each-ref --format="%(refname) %(upstream) %(upstream:track)" refs/heads) 

echo "${branches}" 
branch_checkedout=$(cat .git/HEAD|cut -f2 -d" ") 
echo branch checked out: "${branch_checkedout}" 

while read -r branch_line; do 
    ahead=0 
    behind=0 
    branch_local=$(echo ${branch_line}|cut -f1 -d" ") 
    branch_remote=$(echo ${branch_line}|cut -f2 -d" ") 
    echo ${branch_line} | grep "ahead" >/dev/null && ahead=1 
    echo ${branch_line} | grep "behind" >/dev/null && behind=1 
    NAHEAD=$(($(git rev-list --count ${branch_remote}..${branch_local} 2>/dev/null) +0)) 
    NBEHIND=$(($(git rev-list --count ${branch_local}..${branch_remote} 2>/dev/null) +0)); 

    if [ "$NBEHIND" -gt 0 ]; then 
    if [ "$NAHEAD" -gt 0 ]; then 
     echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded"; 
    elif [ "${branch_local}" = "${branch_checkedout}" ]; then 
     echo " branch ${branch_local} was $NBEHIND commit(s) behind of ${branch_remote}. fast-forward merge"; 
     echo "git merge -q ${branch_remote}" 
     git merge -q ${branch_remote}; 
    else 
     echo " branch ${branch_local} was $NBEHIND commit(s) behind of ${branch_remote}. reseting local branch to remote"; 
     bl=${branch_local#*/} 
     bl=${bl#*/} 
     echo "git branch -l -f ${bl} -t ${branch_remote}" 
     git branch -l -f ${bl} -t ${branch_remote} >/dev/null; 
    fi 
    fi 
done <<< "${branches}" 

的使用注意事項的:

  • branches=$(git for-each-ref --format="%(refname) %(upstream) %(upstream:track)" refs/heads)
    得到既充分上游分支名,及前進/落後狀態
  • branch_checkedout=$(cat .git/HEAD|cut -f2 -d" ")獲取結賬分行的名稱
  • while read -r branch_line; do循環僅與上行流樹枝,而不是「所有的遙控器」(這可能會或可能不包括定分支)
+0

非常感謝你,我已經用'git version 2.10.1.windows.1'和'sourcetree 1.5.2'進行了測試,它的工作非常好。我沒有時間去測試它。順便說一句,你是否預見過在使用腳本之前需要特別小心的情況? – BPL

+0

@BPL到目前爲止,我沒有得到任何特殊情況。我會檢查涉及子模塊條目的repo,看看是否有問題。 – VonC

1

首先檢查您的upstream branch for master:它可能不是origin,這就是爲什麼從原點拉動可能對master沒有任何影響。

git rev-parse --abbrev-ref --symbolic-full-name [email protected]{u} 

其次,在腳本中的數量提交超前/落後顯示,使用Git 1.9 syntax %(upstream:track)

git for-each-ref --format="%(refname:short) %(upstream:track)" refs/heads 

注意,上游分支(或遠程跟蹤分支,即你是分支從中拉出)可能與您推送的分支不同。
檢查,如果你看到一個推網址:

git config --get-regexp branch.master 
+0

首先,感謝您的回答。您能否指定如何將這3個命令集成到腳本中,以便測試它?我是一個使用git的總新手,所以我有點不知所措了 – BPL

+0

@BPL命令1和命令3讓你看看master是如何配置的:它的遠程跟蹤分支是什麼(或「上游」分支,即從哪個遠程分支拉),它的分支是什麼。命令2將按原樣使用,您的腳本必須解析其輸出(如您當前所做的那樣):因此,請嘗試在回購站中使用命令2並查看它的輸出結果,以便對其進行解析。 – VonC

+0

@BPL命令1和3返回什麼? – VonC