簡體   English   中英

Git - 如何查找目錄中所有項目的所有“未推送”提交?

[英]Git - How to find all “unpushed” commits for all projects in a directory?

我終於習慣了 Git,在最初陡峭的學習曲線之后,我必須說它非常好(我只是想念單個文件外部,但那是另一回事了)。 但是,我有一個無法解決的問題:我目前正在同時處理十幾個項目。 它們都是相互關聯的,我必須從一個跳到另一個,在這里和那里做出改變。

到目前為止一切都很好,我可以很容易地“處理”它們,我會定期提交更改等等。 問題是,幾個小時后,我不記得我將哪些項目推送到遠程存儲庫。 當然,我可以“cd”到每個項目的目錄並發出push命令,但是很乏味。 我想知道是否有辦法使用 bash 運行類似git find all unpushed commits in all projects in this directory 此類命令將從一個目錄運行,該目錄不是Git 存儲庫,但包含所有項目的樹。

邏輯很簡單,但實現起來卻顯得相當復雜,也是因為,雖然根目錄包含了所有的項目,但實際的 Git 倉庫可以在起始目錄的任何級別找到。 例如:

  • 項目目錄
    • 客戶 X
    • 項目 1 (Git 存儲庫)
    • 客戶U
    • 項目 2 (Git 存儲庫)
    • 項目3
      • somelibrary (Git repo)
      • 主題(Git 回購)

在這個例子中,只有粗體的目錄是 Git 存儲庫,因此檢查應該在它們內部運行。 我知道結構看起來有點亂,但實際上很容易處理。

歡迎任何幫助,謝謝。

您可以使用git cherry找到未推送的提交,因此您應該能夠編寫一個 bash 腳本,例如

#!/bin/bash
for file in `find ./ -type d -maxdepth 3` ; do
    cd $file
    git cherry -v
    cd -
done

它會找到 3 層子目錄,但看起來可能不太好。

編輯

正如 Evan 建議的那樣,您可以使用子shell 來避免cd -ing 返回目錄,就像這樣

#!/bin/bash
for file in `find ./ -type d -maxdepth 3` ; do
    (cd $file && git cherry -v)
done

您可能想在此處放置一個pwd命令以查看您所在的文件/目錄...

你可以看看 git 子模塊,但我個人覺得和它們一起工作並不愉快。前段時間我因此創建了一個腳本來處理 git 存儲庫的集合: https : //github.com/mnagel/clustergit

clustergit允許您一次在多個存儲庫上運行 git 命令。 在一個文件夾上遞歸運行 git status 尤其有用。 clustergit支持git statusgit pullgit push等。

在此處輸入圖片說明

使頂層成為一個 git repo,並使每個項目成為一個子模塊。 現在你可以運行

git submodule foreach --recursive git status # or any other command

如果您的項目中沒有任何子模塊,則不需要遞歸。

您可以使用以下單行代碼,根據您的要求,您可以使用它從非 Git 存儲庫的目錄中進行搜索。 這將列出具有未推送提交的 git 存儲庫的絕對路徑:

find . -type d -iname '.git' -exec sh -c 'cd "${0}/../" && git status | grep -q "is ahead of" && pwd' "{}" \;

這是通過遞歸搜索 .git 目錄來工作的,當找到 cd 到父目錄時,它是 git 項目根目錄。 然后對“領先於”短語運行 git status 和 grep 。 如果這是真的,執行 && 之后的命令,在這種情況下是 'pwd' 命令。 您可以在此處插入自己的命令(例如顯示未推送的提交)。

注意:僅適用於活動分支上的未推送提交

以下命令也支持帶有空格的路徑,並且只會檢查包含.git子目錄的.git

每個 repo 的未推送更改數(對於所有分支):

while IFS= read -r -d '' dir; 
    do 
        ([ -d "$dir/.git" ] && cd "$dir" && echo -n `pwd`\
        && echo " [ UNPUSHED: "`git log --branches --not --remotes | grep "^commit" | wc -l`" ]" ); 
    done < <(find -type d -print0)

每個 repo 的未提交文件數(暫存和未暫存):

while IFS= read -r -d '' dir; 
    do 
        ([ -d "$dir/.git" ] && cd "$dir" && echo -n `pwd`\
         && echo " [ UNCOMMITTED: "`git status -s | wc -l`" ]"); 
    done < <(find -type d -print0)

請注意,如果未設置上游 (-u),則git cherry不起作用,而上面的git log可以。

將此別名添加到您的.gitconfig文件,然后您可以從父目錄運行git status-all以遞歸獲取所有 git 存儲庫的狀態。

[alias]
status-all = "!for d in `find . -name \".git\"`; do echo \"\n*** Repository: $d ***\" && git --git-dir=$d --work-tree=$d/.. status; done"

另見這篇文章

這是給那些使用fish人的答案。 基於 JKirchartz 的回答,並進行了一些調整:

for file in (find . -type d -maxdepth 3)
  if test -d "$file/.git"
    fish -c "cd $file; and git cherry -v; and pwd"
  end
end

暫無
暫無

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

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