Bash

為每個 git 儲存庫應用特定命令

  • December 27, 2013

我想壓縮我電腦上的所有 git 儲存庫(比如在 中~)。即,對於每個{}包含名為 的目錄或文件(如果是子模組)的目錄.git,我想執行git gc --aggressive --git-dir={}.

我嘗試了以下方法:

/bin/find /c/libs/boost/ -name '.git' -print -exec git --git-dir=dirname {} gc --aggressive \;

但輸出包含很多fatal: Not a git repository: 'dirname /c/libs/boost/.git'等。我應該怎麼做才能dirname正確使用命令?或者別的什麼來達到預期的效果?

您將單詞dirname作為參數傳遞給--git-dir.

使用 GNU 或 FreeBSD 查找,該-execdir操作在包含匹配文件的目錄中執行命令。

find /c/libs/boost/ -name '.git' -execdir git gc --aggressive \;

如果您的 find 命令沒有-execdir,您可以將.git目錄作為參數傳遞給--git-dir.

find /c/libs/boost/ -name '.git' -exec git --git-dir {} gc --aggressive \;

通常,如果您需要 shell 擴展,請顯式呼叫 shell,使用sh -c 'shell command'. 不要嘗試在 shell 命令中執行任何插值,因為文件名包含特殊字元會失敗。將匹配項作為參數傳遞給 shell 腳本。請注意,之後sh -c 'shell command',第一個參數是$0,而其他參數 ( $1, $2, …) 共同形成"$@"

find /c/libs/boost/ -name '.git' -exec sh -c 'cd "${0%/.}" && git gc --aggressive' {} \;
find /c/libs/boost/ -name '.git' -exec sh -c 'for dir; do cd "${dir%/.}" && git gc --aggressive' _  {} +

引用自:https://unix.stackexchange.com/questions/106704