我正在運行一個 jenkins 管道,它像這樣獲取 git repo:
stage('Stash sources') {
steps {
script {
stash name: 'repo_source'
}
}
}
輸出:

然后我想與這樣的分支進行比較:
git diff --name-only -r ${env.CHANGE_BRANCH} ${env.CHANGE_TARGET} | xargs -L1 dirname | uniq | awk '{print "./"\$0}'
但是,詹金斯現在沒有分支,得到這個輸出:

uj5u.com熱心網友回復:
您的 Jenkins 設定,根據您顯示的審查影像(順便說一下,不要使用剪切和粘貼文本將提供服務的影像),通過以下方式“克隆”存盤庫:
- 創建一個空的存盤庫(一個沒有提交也沒有分支
git init <path>:) - 添加遙控器 (
git config remote.origin.url <url>,git config remote.origin.fetch <refspec>) - 跑步
git fetch ... -- <url> <refspec>
這個程序有點傻,因為它可以通過git clone和/或不重復 URL 和/或 refspec 來完成。
您的refspecJenkins 代碼使用的是:
refs/heads/PRCI:refs/remotes/origin/PR-262
此 refspec 意味著您的 Git 僅復制可從originGit 存盤庫PRCI分支訪問的提交;這些提交在您的存盤庫中沒有分支,但通過名稱找到origin/PR-262。
然后您的 Jenkins 代碼運行git checkout 1b6c2cf8af034bb41661dce739d9a0058<something-obscured>。大概這是一個完整的原始哈希 ID。這不會創建新的分支,因此您的存盤庫將繼續沒有分支;HEAD現在在指定的提交處分離。
Jenkins 本身非常可怕,我不是 Jenkins 專家,但這顯然不是你想要的。你需要重新配置它,或者使用不同的插件,或者其他東西,或者撰寫一個 Jenkinsfile,這樣你就可以更直接地控制一切。讓您的 Jenkinsgit clone正常運行和/或使用適當的 refspec 復制或創建您想要的所有分支。一個簡單(雖然有點貴)的方法是制作一個完整的克隆并復制所有分支:
git fetch origin ' refs/heads/*:refs/heads/*'
refs/remotes/origin/或者您可以使用git diff. 也就是說,而不是:
git diff --name-only -r ${env.CHANGE_BRANCH} ${env.CHANGE_TARGET} | ...
你可以使用:
git diff --name-only -r origin/${env.CHANGE_BRANCH} origin/${env.CHANGE_TARGET} | ...
(但您仍然需要一個完整的克隆,而不是一個將分支更改PRCI為 remote-tracking-name的克隆PR-262)。
這里可能還有其他事情可以解釋奇怪的 refspec 傳遞給的原因git fetch,并且值得弄清楚那是什么。
uj5u.com熱心網友回復:
您是否將兩個分支都檢出到本地作業區?如果您的CHANGE_TARGET分支位于遠程且未在本地簽出,則 git 無法找到該分支來進行 diff。該錯誤表明該分支在您的作業樹中不可用,這是指您的本地檔案系統。所以首先進行結帳,然后執行差異應該沒有問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/497286.html
