我在我的智慧的盡頭試圖創建一個長 git 命令的別名。命令格式如下:
git clone "https://[email protected]/a/PathToRepo/RepoName" && (cd "RepoName" && mkdir -p .git/hooks && curl -Lo `git rev-parse --git-dir`/hooks/commit-msg https://[email protected]/tools/hooks/commit-msg; chmod x `git rev-parse --git-dir`/hooks/commit-msg)
我可以使用別名或 bash 函式來幫助我完成此任務。
uj5u.com熱心網友回復:
不要使用別名。它們在各個方面都不如功能。
將其撰寫為函式還可以避免您在嘗試創建別名時可能遇到的參考錯誤(盡管也并非不可能解決這些錯誤;但如果這是您想要的,可能會在您的實際嘗試中提出一個新問題)。
與您的原始版本相比,以下內容只有很小的變化(并且就原始版本的作業原理而言,它在沒有任何更改的情況下也能正常作業)。
func () {
git clone "https://[email protected]/a/PathToRepo/RepoName" &&
(
cd "RepoName" &&
mkdir -p .git/hooks &&
curl -Lo "$(git rev-parse --git-dir)/hooks/commit-msg" "https://[email protected]/tools/hooks/commit-msg" &&
chmod x "$(git rev-parse --git-dir)/hooks/commit-msg"
)
}
從遺留`command substitution`語法到現代$(command substitution)語法的轉換主要是出于審美原因。添加雙引號對于處理包含空格或其他 shell 元字符的檔案名至關重要。添加&&而不是;之前chmod x似乎對一致性有意義。
就個人而言,我會呼叫git rev-parse --git-dir兩次,然后創建一個帶有目錄名稱的變數:
func () {
git clone "https://[email protected]/a/PathToRepo/RepoName" &&
local hookdir=RepoName/$(git -C "RepoName" rev-parse --git-dir)/hooks &&
mkdir -p "$hookdir" &&
curl -Lo "$hookdir/commit-msg" "https://[email protected]/tools/hooks/commit-msg" &&
chmod x "$hookdir/commit-msg"
}
如果您想讓存盤庫名稱和/或 URL 可配置引數,我建議將存盤庫名稱設為第一個引數,將基本 URL 設為第二個引數,但這顯然取決于您的用例。
func () {
git clone "${2-https://[email protected]/a/PathToRepo}/$1" &&
local hookdir="$1"/$(git -C "$1" rev-parse --git-dir)/hooks &&
mkdir -p "$hookdir" &&
curl -Lo "$hookdir/commit-msg" "https://[email protected]/tools/hooks/commit-msg" &&
chmod x "$hookdir/commit-msg"
}
語法${2-default}回退到defaultif$2未設定。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380594.html
