Git

為 GIT 複製創建理智

  • February 19, 2020

我想創建一個每 5 分鐘執行一次 GIT clone sanity 的 Jenkins 管道。如果 GIT 複製命令不工作/失敗或通過,我如何捕捉錯誤/問題?

一般的做法是

if command; then
   # Every went OK
else
   # Something failed
fi

它適用於git

if git clone ...; then
   # The repo was cloned correctly
else
   # Something failed
fi

僅當git clone命令以狀態 0 退出時才進行第一個分支,表示成功;任何其他退出狀態都被視為失敗,並導致採用第二個分支。

使用不存在的文件acat如果git它相當於:

]# e=$(cat a 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: a: No such file or directory"

現在我有命令的輸出,即 cat 的標準輸出被標準錯誤替換,作為“結果”值。返回碼免費提供為$?.

為了比較成功cat

]# e=$(cat atext 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=0 out=""

-> 成功重定向到 null、空錯誤消息。

]# e=$(cat atext)
]# echo ret=$? out=\"$e\"
ret=0 out="First line of a"

-> 成功,所以 “$e” 保存數據。


]# e=$(cat xxx 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: xxx: Is a directory"

-> 消息詳細,但退出程式碼保持統一。

是的,我有一個目錄xxxgit clone .git xxx當我試圖引發特定錯誤時,它剛剛為我做了。

(所以我切換到cat

]# e=$(cat -M 2>&1 1>/dev/null)
]# echo ret=$? out=\"$e\"
ret=1 out="cat: invalid option -- 'M' Try 'cat --help' for more information."
]# 

仍然 ret=1。


評論中的連結顯示了一些關於缺少 git特定錯誤程式碼的投訴。我認為這是一個雙重誤解,因為(瓷器)git 命令是為互動式使用而製作的,而(bash)shell 對輸入和輸出有自己的概念。

在我的範例中,我不應該抱怨 cat 的統一錯誤程式碼“1”,或者嘗試在復雜腳本中擷取和解析消息(這與簡單程序相反)。我應該先檢查一切是否準備就緒,並在必要時告訴使用者(錯誤或警告)。

我想知道你從什麼樣的錯誤程式碼中得到git clone。git 的手冊頁對返回碼非常沉默。就像 vi 的例子一樣。非常不同mount,它的“程式碼可以被 ORed”。


給定一個“不安全”命令git clone $d,我可以將錯誤程式碼與源一起添加到消息中。這是一個互動式單線:

]# d='xxx'; git clone $d || echo "g. cl. failed with $?"
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128

作為一個腳本,這不是很明顯;我會這樣做:

]# . gc.sh 
fatal: destination path 'xxx' already exists and is not an empty directory.
g. cl. failed with 128

cat gc.sh

d='xxx'
git clone $d; ret=$?  
if (( $ret > 0 )) 
  then echo "g. cl. failed with $ret"
fi

否則$?不夠新鮮。並且對真/假的測試也是明確的。

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