簡體   English   中英

查看多個git存儲庫的日志

[英]View logs of multiple git repositories

我在目錄中有git存儲庫。 例如,

$ ls
repo1 repo2 repo3 repo4

我想快速查看所有存儲庫的最后k個提交日志。 k等於3。)

對於repo1,我可以打印最后3個提交日志,然后返回到該目錄,如下所示:

$ cd repo1; git log -3 ; cd ../

但我不想在所有存儲庫中重復此操作。 我正在尋找一種輕松實現此目標的聰明方法。 (也許使用xargs?)

我正在使用Bash。 謝謝。

使用xargs通常是沒有意義的,因為find可以自己執行一些事情:

find ~/src/ -maxdepth 2 -name .git -execdir git log \;

說明:

find ~/src/

在〜/ src /下查找內容。 如果需要,可以傳遞多個參數,這可能是由於Shell glob所致。

-maxdepth 2

不要深入地遞歸。 由於命中文件系統相對較慢,因此可以節省大量時間。

-maxdepth 2將找到〜/ src / .git(如果存在)和〜/ src / foo / .git,因此無論您傳遞repo目錄本身還是僅傳遞包含所有存儲庫的目錄,都可以使用它。

如果只想自己傳遞存儲庫目錄,則-maxdepth 1將起作用(並且在IO上更容易)。

-maxdepth 3有時可能會在某些源層次結構中使用,但是對於它們,您最好只傳遞其他目錄以find

-name .git

我們正在尋找.git目錄(或文件!是的,git -execdir ),因為-execdir通常接受一個{}參數,並將其傳遞給命令。 傳遞的文件名將只是基本名稱(這樣,例如mv可以使用...請記住, find通常可用於文件),並且將工作目錄設置為包含該名稱的文件。

-execdir ... \\;

在倉庫中運行命令。 該命令(此處... )可以包含任何內容,尤其是-不會被find本身解釋的選項...除了單詞中任何地方的{}是文件名,一個孤獨者之外; 終止命令(但此處是外殼程序的轉義符), +終止命令,但一次傳遞多個文件。

對於此用例,我們不需要傳遞文件名,因為運行程序的目錄提供了所有必需的信息。

我有類似的東西,很容易更改以滿足您的要求:

CODE_BASE=(/parentdir/to/your/repositories 
/another/parent/dirs
/another/parent/dirs/if/you/have
)
EXCLUDE_PATT="gitRepoYouWantToIgnore" #this is regex

for base in ${CODE_BASE[@]};do
    echo "##########################"
    echo "   scanning $base"
    echo "##########################"
    for line in $(find "$base" -name ".git"|grep -v "$EXCLUDE_PATT"); do
        line=$(sed 's#/\.git##'<<<"$line")
        repo=$(awk -F'/' '$0=$NF' <<<"$line")
        echo "##########################"
        echo "====> Showing log of Repository: $repo <===="
        echo "##########################"
        git -C "$line" log -3
    done
done

例如,保存到showlog.sh ,然后執行它。 您可以添加更多log參數,以使日志輸出適合您的需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM