2017-06-13 97 views
0

我正在寫一個腳本來列出我的系統上的所有git存儲庫,它們的分支以及系統上的最新提交。所以我創建了這個腳本打印出以下內容。遠程的url可以包含在`git for-each-ref`命令的輸出中嗎?

directory, branch(ref), date, commit hash, date, commit message, ref (again)

#!/bin/bash 
IFS=' 
' 
for directory in `ls -d $1/*/`; do 
    # echo "$directory : $directory.git" 
    if [[ -d $directory/.git ]] ; then 
     # filter=/refs/heads 
     filter='' 
     for branch in $(git -C $directory for-each-ref --format='%(refname)' $filter); do 
      echo $directory : $branch : "$(git -C $directory log -n 1 --oneline --pretty=format:'%Cred%h - %C(yellow)%ai - %C(green)%s %C(reset) %gD' $branch)" : $(echo $branch | rev | cut -d\/ -f-1 | rev) 
     done 
    fi 
done 

我沒有的是遙控器的存儲庫URL。遠程的URL是否可以作爲git for-each-ref命令輸出的一部分打印?

我想我可以用git remote -C $directory -v列出的所有遠程存儲庫到我會用在refs/remotes/xxxxxxxxxx每個值到這將被添加到echo命令變量的查找列表。

回答

1

您可以使用git for-each-ref來生成隨後將使用eval進行評估的任意腳本。適應你的情況下,最長的examples from the documentation on git for-each-ref,我來到了以下內容:

#!/bin/bash 
IFS=' 
' 
for directory in "$1"/*/ ; do 
    # echo "$directory : $directory.git" 
    if [[ -d $directory/.git ]] ; then 
     # filter=/refs/heads 
     filter='' 
     fmt=" 
      dir=$directory"' 
      ref=%(refname) 
      refshort=%(refname:short) 
      h=%(objectname:short) 
      date=%(authordate:iso) 
      subj=%(subject) 

      printf "%s : %s : %s - %s - %s : %s" "$dir" "$ref" %(color:red)"$h" %(color:yellow)"$date" %(color:green)"$subj" %(color:reset)"$refshort" 
      if [[ $ref == refs/remotes/* ]] 
      then 
       remotename="${ref#refs/remotes/}" 
       remotename="${remotename%%/*}" 
       printf " : %s" "$(git -C "$dir" remote get-url "$remotename")" 
      fi 
      printf "\n" 
     ' 

     eval="$(git -C $directory for-each-ref --shell --format="$fmt" $filter)" 
     eval "$eval" 
    fi 
done 

需要注意的是,我從您的實現擺脫git log的,但作爲一個結果,我也放棄了%gD場,因爲我沒有」 t很好理解它的含義,並且找不到git-for-each-ref內部如何獲得它。另外,我改變了從全文中獲得短參的方式;我的實現並不等同於你,但會產生明確的結果)。

+0

感謝您的回覆。我使用'git log -n 1'確保只返回每個分支上的最新提交。你的命令如何實現,它是內置的? 'remotename =「$ {ref#refs/remotes /}」; remotename =「$ {remotename %%/*}」工作如何?這是有點bash我不明白。問題與關於git的bash相同,這是原始草案中的一個註釋。 – vfclists

+1

@vfclists'$ {parameter#word}'和'$ {parameter %% word}'是shell參數擴展的形式,它們分別從變量的開始和尾部分別移除指定的模式。有關更多詳細信息,請閱讀https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html – Leon

+1

@vfclists *我使用git log -n 1來確保每個分支上只有最新的提交是回。你的命令是如何實現的,它是內置的?*由於你只關心每個分支上的最新提交(即分支的提示),所以你可以將分支的符號名稱轉換爲提交的哈希它指的是。在'git for-each-ref'中,它可以作爲'%(objectname)'獲得。 – Leon