精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

在 Swift 中編寫腳本:Git Hooks

移動開發 iOS
在本例中,我使用了 commit-msg 鉤子,它能夠在當前提交信息生效前修改此信息。鉤子由一個參數調用,該參數是指向包含用戶輸入的提交消息的文件的路徑。這意味著,為了改變提交消息,我們只需要從文件中讀取、修改其內容,然后寫回調用掛鉤的文件。

前言

這周,我決定完成因為工作而推遲了一周的TODO事項來改進我的Git工作流程。

為了在提交的時候盡可能多的攜帶上下文信息,我們讓提交信息包含了正在處理的JIRA編號。這樣,將來如果有人回到我們現在正在提交的源代碼,輸入??git blame??,就能很容易的找出JIRA的編號。

每次提交都包含這些信息可能會有點乏味(如果你使用了類似TDD[1]之類的方法,您會提交的更加頻繁),而且,盡管像Tower[2]這樣的git客戶端會讓此變得容易一些,但是您仍然需要手動將問題編號復制粘貼到提交消息中,并且記住這樣做,這是我最難以解決的問題??。

出于這個原因,我開始尋求了解git hooks,試圖自動化這項任務。我的想法是能夠從git分支獲取JIRA編號(我們有一個分支命名約定,形如:story/ISSUE-1234_branch-name),然后將提交消息更改為以JIRA編號為前綴,從而生成最終結果消息:ISSUE-1234-其他原本的提交信息。

用git hooks自動生成提交信息

?Git Hooks[3] 提供了一種在運行某些重要的git命令時觸發自定義操作的方法,例如在一次commit或者push之前執行一些操作。

在本例中,我使用了 commit-msg 鉤子,它能夠在當前提交信息生效前修改此信息。鉤子由一個參數調用,該參數是指向包含用戶輸入的提交消息的文件的路徑。這意味著,為了改變提交消息,我們只需要從文件中讀取、修改其內容,然后寫回調用掛鉤的文件。

要創建git鉤子,我們需要在 .git/hooks? 路經下提供一個可執行腳本。我的鉤子放在了 .git/hooks/commit-msg 路經之下。

為什么我使用Swift?

Git hooks可以使用任何你熟悉的,并且在主機上安裝了解釋器(通過shebang來指定)的腳本語言來編寫。

雖然有很多更受歡迎的選項,比如bash?、ruby等等,但我還是決定使用Swift。因為我對Swift更熟悉,因為我每天都在使用它,而且我真的非常喜歡它強大的類型語法以及低內存占用。

讓我們開始吧

你可以使用任何你喜歡的IDE編寫Swift腳本。但是如果你想要有適當的代碼補全以及調試能力,你可以為其創建一個Xcode項目。為此,在 macOS? 下選擇 Command Line Tool 創建一個新的項目。

圖片

在創建的文件頂部加上Swift shebang,引入Foundation庫。

#!/usr/bin/swift
import Foundation

這樣當git執行文件時,shebang將確保使用文件作為輸入數據調用/usr/bin/swift二進制文件。

編寫git鉤子

項目已經全部設置好,所以現在可以編寫git掛鉤了。讓我們走完所有的步驟。

檢索提交消息

要做的第一件事就是從腳本傳進來的參數檢索臨時提交文件的路徑然后讀取文件內容。

let commitMessageFile = CommandLine.arguments[1]
guard let data = FileManager.default.contents(atPath: commitMessageFile),
let commitMessage = String(data: data, encoding: .utf8) else {
exit(1)
}

在上面的代碼片段中,我們首先拿到了提交文件的路徑(git?傳遞給腳本),然后通過FileManagerAPI?讀取了文件內容。如果因為一些原因檢索失敗了,我們退出(exit?)腳本同時返回狀態碼1,這將告訴git終止此次提交。

注意:

根據git hooks文檔,如果任何鉤子腳本返回的狀態碼大于??0??,它都將終止即將要要發生的操作。這將在本文后面的部分中使用,以便在不需要做任何修改而優雅地退出。

檢索問題編號

既然提交信息的字符串已經可用,接下來就需要找到當前分支并從中檢索到問題編號。正如本文前面提到的,這只可能是因為團隊對分支命名的嚴格格式,在其名稱中始終包含JIRA編號(例如,story/ISSUE-1234_some-awesome-feature-work)。

為了實現這一點,我們必須檢索當前的工作分支,然后用正則表達式從中檢索問題編號。

讓我們從添加腳本調用zsh shell?命令的能力開始。通過使用Process?api,腳本可以與git命令行界面交互。

func shell(_ command: String) -> String {
let task = Process()
let outputPipe = Pipe()
let errorPipe = Pipe()
task.standardOutput = outputPipe
task.standardError = errorPipe
task.arguments = ["-c", command]
task.executableURL = URL(fileURLWithPath: "/bin/zsh")
do {
try task.run()
task.waitUntilExit()
} catch {
print("There was an error running the command: \(command)")
print(error.localizedDescription)
exit(1)
}
guard let outputData = try? outputPipe.fileHandleForReading.readToEnd(),
let outputString = String(data: outputData, encoding: .utf8) else {
// Print error if needed
if let errorData = try? errorPipe.fileHandleForReading.readToEnd(),
let errorString = String(data: errorData, encoding: .utf8) {
print("Encountered the following error running the command:")
print(errorString)
}
exit(1)
}
return outputString
}

現在實現了shell?命令,那么就可以使用它詢問git當前分支是什么,然后盡可能的從中提取出問題編號。

let gitBranchName = shell("git rev-parse --abbrev-ref HEAD")
.trimmingCharacters(in: .newlines)
let stringRange = NSRange(location: 0, length: gitBranchName.utf16.count)
guard let regex = try? NSRegularExpression(pattern: #"(\w*-\d*)"#, options: .anchorsMatchLines),
let match = regex.firstMatch(in: gitBranchName, range: stringRange) else {
exit(0)
}
let range = match.range(at: 1)
let ticketNumber = (gitBranchName as NSString)
.substring(with: range)
.trimmingCharacters(in: .newlines)

請注意,如果沒有匹配項(即分支名稱中不包含JIRA問題編號),腳本將以0的狀態退出,允許提交繼續進行,而不進行任何更改。這是為了不破壞諸如main或其他測試/調查分支中的工作流。

修改提交信息

為了更改提交消息,必須將腳本開頭讀取的文件內容(包含提交消息)寫回同一路徑。

在這種情況下,只需要做一個更改,即在提交信息的前面加上JIRA編號和(-),以將其與提交信息的其余部分很好地分開。還必須確保檢查了提交信息字符串,僅在編號不存在時才添加編號:

if !commitMessage.contains(ticketNumber) {
do {
try "\(ticketNumber) - \(commitMessage.trimmingCharacters(in: .newlines))"
.write(toFile: commitMessageFile, atomically: true, encoding: .utf8)
} catch {
print("Could not write to file \(commitMessageFile)")
exit(1)
}
}

設置git鉤子

現在腳本已經準備好了,是時候把它放在git可以找到它的位置了。Git鉤子可以全局設置,也可以基于單個repo設置。

我個人對這類腳本的偏好是基于單個repo設置,因為這樣可以在出現問題時為您提供更多的控制和可見性,并且如果鉤子開始失敗,它會在它設置的repo中失敗,而不是全局都失敗。

要設置它們,我們只需要使文件可執行,重命名并將其復制到所要設置repo的.git/hooks/路徑之下:

chmod +x main.swift
mv main.swift <path_to_your_repo>/.git/hooks/commit-msg

測試結果

現在repo已經全部設置好了,剩下的就是對部署的腳本進行測試。在下面的截屏中,創建了兩個分支,一個帶有問題編號,一個沒有,它們有著相同的提交信息。可以看出腳本運行正常,并且只在需要時才更改提交消息!

圖片

參考資料

[1] TDD: https://en.wikipedia.org/wiki/Test-driven_development。

[2] Tower: https://www.git-tower.com/mac。

[3] Git Hooks: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks。

責任編輯:姜華 來源: Swift社區
相關推薦

2024-08-12 08:33:05

2010-09-09 11:16:06

CSS交互

2014-07-04 09:47:24

SwiftSwift開發

2022-08-21 09:41:42

ReactVue3前端

2025-11-07 09:17:58

2014-07-22 09:01:53

SwiftJSON

2017-04-12 11:16:08

Python終端編程

2022-09-15 07:44:32

Git全局配置本地配置

2021-09-08 14:47:53

UbuntuLinux服務

2012-04-26 14:02:58

ibmdw

2022-06-21 09:26:21

Shell腳本JavaScript

2024-01-08 13:31:00

Rust自動化測試

2024-09-19 20:59:49

2015-08-06 13:44:21

swiftcocoapods

2019-12-31 08:00:00

DebianLinuxApple Swift

2018-05-10 13:45:15

Swift網絡層協議

2015-12-17 13:19:29

編寫高性能Swift

2022-11-17 10:23:13

VS CodeCodiumPython

2011-05-27 11:01:10

DreamweaverCSS

2009-06-15 17:24:59

Groovy正則表達式
點贊
收藏

51CTO技術棧公眾號

日本亚洲自拍| 久久九九免费视频| 国产二区视频在线播放| 少妇喷水在线观看| 国产日韩视频| 精品粉嫩超白一线天av| 欧美日韩在线一| 看电影就来5566av视频在线播放| 六月天综合网| 91在线码无精品| 美女少妇精品视频| 美女伦理水蜜桃4| 女生影院久久| 亚洲三级视频在线观看| 国产欧美在线一区二区| 五月天婷婷导航| 亚洲情侣在线| 亚洲国产成人精品久久| 国产成人久久777777| 大胆av不用播放器在线播放| 国产真实乱子伦精品视频| 欧美激情视频给我| 欧美特级黄色录像| 麻豆久久一区| 色女孩综合影院| 成人在线免费观看网址| 日韩国产福利| 国内精品不卡在线| 国产不卡一区二区在线播放| 日韩成人av免费| 天堂av最新在线| 久久久高清一区二区三区| 91久久中文字幕| 日本少妇高潮喷水xxxxxxx| 亚洲二区av| 精品久久中文字幕| 中国一级黄色录像| 男人天堂2024| 欧美日本不卡| 在线成人激情黄色| 久久久久国产精品无码免费看| 成人av集中营| 狠狠躁夜夜躁久久躁别揉| 一区二区三区四区五区视频| 欧美熟妇乱码在线一区| 精品写真视频在线观看| 欧美日本一区二区视频在线观看| 欧美激情一区在线观看| 国产精品久久九九| 国产精品久久久久久久久久久久久久久久 | 狠狠色综合色综合网络| 欧美激情免费视频| 三级影片在线看| 色综合天天爱| 亚洲色图综合网| 国模私拍在线观看| 老司机午夜在线| 26uuu另类欧美亚洲曰本| 亚洲最大的成人网| 在线亚洲欧美日韩| 日本午夜一区二区| 欧美最猛性xxxxx亚洲精品| 久久久久久久久久久久久久免费看 | 亚洲乱码国产乱码精品精可以看 | 久久噜噜亚洲综合| 九9re精品视频在线观看re6| 亚洲国产剧情在线观看| 国产在线看一区| 成人xxxx视频| 亚洲在线观看av| 日韩av电影免费观看高清完整版| 555www成人网| 精品少妇一二三区| 午夜久久久久| 欧美精品久久久久久久| 精品无码黑人又粗又大又长| 欧美日韩国产欧| 欧美黄色片免费观看| 久久久精品99| 在线精品在线| 欧美在线欧美在线| 日本视频网站在线观看| 久久婷婷久久| 国产精品高潮呻吟视频| 中文亚洲av片在线观看| 蜜桃av噜噜一区二区三区小说| 国产欧美日韩视频| 国产精品一二三四五区| 国产激情视频一区二区三区欧美| 亚洲精品日韩激情在线电影| 午夜精品小视频| 99精品久久只有精品| 蜜桃久久影院| 午夜在线免费观看视频| 亚洲精品视频一区二区| 国产精品久久久久7777| 深夜福利影院在线观看| 99re久久最新地址获取| 久久久国产精品x99av| 午夜爽爽爽男女免费观看| 亚洲欧美一级二级三级| 午夜精品久久久久久久久久久久久 | 亚洲人一区二区| av在线免费观看网站| 中文字幕在线一区| 精品久久久久久无码中文野结衣| 日韩精品美女| 欧美日韩国产综合一区二区| 性一交一黄一片| 欧美猛男同性videos| 国产免费区一区二区三视频免费| 成人激情文学综合网| 久久av二区| 日韩欧美成人一区二区三区| 久久精品官网| 国产一区红桃视频| 欧日韩在线视频| 中文av字幕一区| 欧美国产综合在线| 久久久成人av毛片免费观看| 日韩免费福利电影在线观看| 免费黄色在线视频| 91精品国产成人观看| 51午夜精品视频| 亚洲国产精品久久人人爱潘金莲| 久久精品欧美一区二区三区麻豆| 亚洲综合首页| 擼擼色在线看观看免费| 欧美日韩亚州综合| 亚洲色图14p| 中文字幕一区二区精品区| 97在线看福利| 精品国自产在线观看| 久久精品网站免费观看| 日韩精品一区二区三区四| 国产黄大片在线观看| 欧美欧美欧美欧美首页| 人妻精品久久久久中文字幕69| 老牛精品亚洲成av人片| 欧美日韩二区三区| 人体私拍套图hdxxxx| 久久久久久久久久久妇女| 日av在线播放中文不卡| 精品久久久久久亚洲综合网站| 国产亚洲精品精华液| 91成人综合网| 免费观看性欧美大片无片| 在线观看精品国产视频| 亚洲熟女综合色一区二区三区| 国产一区二区在线观看视频| 日本不卡免费新一二三区| 97超碰在线免费| 精品人在线二区三区| 亚洲综合网在线| 九九视频精品免费| 日韩精品福利视频| av在线加勒比| 亚洲第一级黄色片| av资源吧首页| 成人亚洲一区二区一| 欧美在线观看视频免费| 成人自拍视频网| 在线观看精品国产视频| 精品一区二区无码| caoporen国产精品视频| av在线免费观看国产| 在线观看亚洲精品福利片| 日韩在线视频免费观看高清中文| 自拍偷拍精品视频| 中文幕一区二区三区久久蜜桃| 少妇性饥渴无码a区免费| 色哟哟精品丝袜一区二区| 韩国日本不卡在线| 视频一区二区在线播放| 色综合激情五月| 亚洲av无码一区二区三区观看| 日韩一级不卡| 欧美亚洲另类在线一区二区三区| 网友自拍亚洲| 中文字幕亚洲欧美日韩在线不卡| 国产高清中文字幕| 欧美国产视频在线| 成人不卡免费视频| 欧美精品黄色| 国产在线一区二区三区四区| 欧美性video| 日韩电影视频免费| 青青草视频在线观看免费| 中文字幕va一区二区三区| 日本成人在线免费视频| 久久国产电影| 操一操视频一区| 九色porny自拍视频在线播放| 日韩国产一区三区| 亚洲日本视频在线观看| 国产日韩欧美高清| 国产精品久久久久久久99| 综合久久十次| 激情视频在线观看一区二区三区| 小黄鸭精品aⅴ导航网站入口| 永久免费看mv网站入口亚洲| 国产精品视频a| 性欧美大战久久久久久久久| 婷婷色一区二区三区| 国产一区二区三区四区五区入口| 阿v天堂2018| 奇米亚洲欧美| 亚洲一区免费网站| 美女高潮视频在线看| 中文字幕亚洲色图| 欧美天堂在线视频| 欧美日韩日本视频| 18精品爽视频在线观看| 久久精品夜色噜噜亚洲aⅴ| 一区二区三区入口| 韩国精品一区二区三区| 日本一区免费| 91成人午夜| 国产免费一区二区三区香蕉精| 日本电影在线观看| 日韩性生活视频| 日韩电影在线观看完整版| 欧美一级在线免费| 在线天堂中文字幕| 中文字幕一区二区三中文字幕| 日韩aaaaa| 国产精品资源在线| 手机视频在线观看| 国产精品啊啊啊| 亚洲图片都市激情| 伊人久久大香线蕉av不卡| 97自拍视频| 四虎影视精品永久在线观看| 久久久欧美一区二区| 理论片午午伦夜理片在线播放| 精品视频久久久久久久| 亚洲精品久久久久久久久久| 欧美精品国产精品| 久久久久久久亚洲| 懂色av影视一区二区三区| 久草网站在线观看| 中文字幕在线观看一区| 四虎永久免费在线观看| www.亚洲激情.com| 在线播放av网址| 国精产品一区一区三区mba视频| 凹凸日日摸日日碰夜夜爽1| 日韩天天综合| www.好吊操| 欧美日韩一区自拍| 日韩一级片一区二区| 91偷拍一区二区三区精品| 日本一区二区精品视频| 一道本一区二区三区| 激情小说网站亚洲综合网| 超碰成人在线免费| 99精品99久久久久久宅男| а天堂中文最新一区二区三区| 国产精品极品尤物在线观看 | 美日韩精品视频免费看| 91福利在线视频| 亚洲天堂男人的天堂| 欧美自拍偷拍一区二区| 亚洲国内精品视频| 神马久久久久久久久久| 亚洲国产成人久久综合| 蜜桃视频污在线观看| 精品国产一区二区三区忘忧草 | 国产亚洲人成a在线v网站| 国产欧美精品日韩| 伊人精品综合| 欧美日韩亚洲免费| 99久久精品国产亚洲精品| 欧美交换配乱吟粗大25p| 99国产精品99久久久久久粉嫩| 久久精品99国产| 韩国视频一区二区| 国产一级免费片| 欧美国产精品一区二区| 国产av 一区二区三区| 婷婷综合另类小说色区| 波多野结衣人妻| 日韩视频一区二区| 日本v片在线免费观看| 日韩在线视频免费观看| 国产在线天堂www网在线观看| 国产精品久久一区主播| 99久热这里只有精品视频免费观看| 欧美精品成人一区二区在线观看| 999精品在线| 欧美 日韩 国产在线观看| 美女精品一区二区| 亚洲国产第一区| 综合久久国产九一剧情麻豆| 成年人午夜视频| 在线不卡的av| 日韩精品福利| 久久久久久久影院| 亚洲久草在线| 日本一区二区精品| 亚洲第一网站| 国产农村妇女精品久久| 久久久亚洲综合| 久久久www成人免费毛片| 欧美日韩不卡在线| 日本ー区在线视频| 久久人人97超碰精品888| 四虎影视成人精品国库在线观看| 欧美日韩一区二区三| 亚洲三级毛片| 欧美性猛交xx| 最新日韩av在线| 人人妻人人爽人人澡人人精品| 亚洲国产精品推荐| 在线看福利影| 成人写真视频福利网| 日韩免费久久| 日本久久精品一区二区| 91在线视频免费观看| 黄色一级片在线免费观看| 欧美精品一二三| 99中文字幕一区| 国产精品久久久久久久久久久不卡 | 欧美日韩中文精品| 内衣办公室在线| 8090成年在线看片午夜| 成人av资源网址| 天天做天天躁天天躁| 国产一区二区三区免费播放| 天堂资源在线视频| 在线精品观看国产| 国产在线视频网址| 国产成+人+综合+亚洲欧洲 | yellow中文字幕久久| 99久久婷婷国产综合精品首页 | 在线亚洲欧美| japanese在线观看| 亚洲成在线观看| 天天干天天插天天操| 97高清免费视频| 日韩深夜福利| 国产精品97在线| 久久久久久久电影| 999视频在线| 亚洲最新视频在线| 韩国成人在线| 亚洲午夜高清视频| 国产在线视频一区二区三区| 9999热视频| 欧美mv日韩mv国产| 91九色国产在线播放| 久久久亚洲综合网站| 水野朝阳av一区二区三区| 91精品人妻一区二区三区| 91成人网在线| 欧美videos极品另类| 国产欧美一区二区三区久久| 希岛爱理av一区二区三区| 中文字幕一二三区| 亚洲成人av中文| 麻豆app在线观看| 国产综合视频在线观看| 欧美xxx在线观看| 午夜剧场免费看| 色综合久久久久综合体| 18视频免费网址在线观看| 成人午夜高潮视频| 黄色成人91| 老牛影视av老牛影视av| 欧美唯美清纯偷拍| 性欧美video高清bbw| 久久久久久久久久久久久9999| 日本午夜精品一区二区三区电影| 日本黄色录像视频| 精品va天堂亚洲国产| 欧美日韩在线精品一区二区三区激情综合 | 欧美激情91| 疯狂揉花蒂控制高潮h| 欧美揉bbbbb揉bbbbb| 欧美人体视频xxxxx| 免费国产一区| 国产精品伊人色| 久久久久久少妇| 久久亚洲综合国产精品99麻豆精品福利| 国内精品麻豆美女在线播放视频| 欧美牲交a欧美牲交aⅴ免费下载| 国产精品久久久久久久久快鸭| 亚洲国产成人在线观看| 国产精品激情av电影在线观看 | 自拍一级黄色片| 欧美日韩另类在线| 黄色精品免费看| 久久久久免费网| 国产精品一区二区x88av| 国产午夜性春猛交ⅹxxx| 久久色免费在线视频| 蜜乳av综合| 国产乱国产乱老熟300部视频| 欧美在线观看视频在线| brazzers在线观看|