iOS獲取Git信息

目標(biāo):在iOS的App中獲取到當(dāng)前包所屬的Git信息。
這里我需要當(dāng)前代碼的提交日期、提交作者亭敢、代碼所屬分支、代碼的節(jié)點(diǎn)SHA图筹。

思路:配置script帅刀,獲取到需要的Git的信息然后存入info.plist中,需要的時(shí)候再?gòu)膇nfo.plist中取出远剩。

Step1

Xcode-Build Phases-New Run Script Phase


添加Script.png

為了和項(xiàng)目中的其他腳本區(qū)分開扣溺,建議改個(gè)名字(雙擊Run Script改名字),Run Script改為Git Script瓜晤。


重命名.png

Step2

給對(duì)應(yīng)的Target下的info.plist文件增加以下屬性锥余,用于保存腳本執(zhí)行中設(shè)置的Git信息。

添加字段.png

Step3

復(fù)制粘貼如下腳本到Git Script中:

#最后一次提交的SHA
git_sha=$(git rev-parse HEAD)

#當(dāng)前的分支
git_branch=$(git symbolic-ref --short -q HEAD)

#最后一次提交的作者
git_last_commit_user=$(git log -1 --pretty=format:'%an')

#最后一次提交的時(shí)間
git_last_commit_date=$(git log -1 --format='%cd')

#獲取App安裝包下的info.plist文件路徑
info_plist="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_FOLDER_PATH}/Info.plist"

#利用PlistBuddy改變info.plist的值
//usr/libexec/PlistBuddy -c "Set :'GitCommitSHA'       '${git_sha}'"                "${info_plist}"
/usr/libexec/PlistBuddy -c "Set :'GitCommitBranch'    '${git_branch}'"                 "${info_plist}"
/usr/libexec/PlistBuddy -c "Set :'GitCommitUser'      ${git_last_commit_user}"       "${info_plist}"
/usr/libexec/PlistBuddy -c "Set :'GitCommitDate'      '${git_last_commit_date}'"       "${info_plist}"
Git Script.png

Step4

獲取Git信息

- (NSDictionary *)p_gitInfoDict {
    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
    NSString *gitSHA = [infoDict objectForKey:@"GitCommitSHA"];
    NSString *gitBranch = [infoDict objectForKey:@"GitCommitBranch"];
    NSString *gitCommitUser = [infoDict objectForKey:@"GitCommitUser"];
    NSString *gitCommitDate = [infoDict objectForKey:@"GitCommitDate"];
    gitSHA = [@"GitSHA:" stringByAppendingString:(gitSHA == nil ? @"" : gitSHA)];
    gitBranch = [@"GitBranch:" stringByAppendingString:(gitBranch == nil ? @"" : gitBranch)];
    gitCommitUser = [@"GitCommitUser:" stringByAppendingString:(gitCommitUser == nil ? @"" : gitCommitUser)];
    gitCommitDate = [@"GitCommitDate:" stringByAppendingString:(gitCommitDate == nil ? @"" : gitCommitDate)];
    
    NSDictionary *gitDict = @{@"gitSHA" : gitSHA,
                              @"gitBranch" : gitBranch,
                              @"gitCommitUser" : gitCommitUser,
                              @"gitCommitDate" : gitCommitDate};
    return gitDict;
}

GitHub鏈接請(qǐng)戳我

注意:

1痢掠、多環(huán)境的項(xiàng)目驱犹,在不同Target下的腳本是一樣的,Xcode會(huì)根據(jù)不同target下對(duì)應(yīng)的info.plist(比如develop環(huán)境,對(duì)應(yīng)info_develop.plist)文件在App的安裝包生成的一個(gè)名為info.plist的文件嘲恍,該文件的路徑為

info_plist="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_FOLDER_PATH}/Info.plist"

不需要根據(jù)不同target下的info.plist文件的路徑位置或者名稱的進(jìn)行重寫。
2雄驹、使用模擬器運(yùn)行的話佃牛,如果把腳本刪除后,刪除App重新run依然能夠得Git信息医舆,需要將模擬器Reset俘侠。打出來(lái)的包不會(huì)受此影響。
3蔬将、直接運(yùn)行GitHub鏈接的項(xiàng)目是無(wú)法獲得Git信息爷速,因?yàn)橄螺d的項(xiàng)目沒(méi)有g(shù)it記錄,自己做些改動(dòng)然后commit到本地再run即可霞怀。

包含子工程的項(xiàng)目請(qǐng)繼續(xù)往下看:

iOS子工程獲取Git信息

如果項(xiàng)目中包含子工程惫东,要獲取子工程的git信息,思路如下:
通過(guò)shell腳本保存git信息毙石,但是把git保存到安裝包同級(jí)目錄下的txt文件中廉沮,然后在主工程的腳本中讀取該txt文件,再保存到info.plist中胁黑。

實(shí)際例子如下:

項(xiàng)目結(jié)構(gòu)圖

項(xiàng)目中中包含2個(gè)子工程ShareLibrary、ShareLibrary州泊;
5個(gè)target丧蘸,分別對(duì)應(yīng)Info.plist、Info_Develop.plist遥皂、Info_Api.plist力喷、Info_Sim.plist、Info_Feature.plist 5個(gè)不同的plist文件演训。
我們的例子只對(duì)一個(gè)target進(jìn)行配置弟孟,只保存Git的SHA信息。


項(xiàng)目結(jié)構(gòu).png

Step1:

給info.plist添加字段

添加字段.png

Step2:

子工程ShareLibrary添加Git Script,如下圖:

添加Script.png

子工程ShareLibrary的Git Script:

#最后一次提交的SHA
git_sha=$(git rev-parse HEAD)
git_filePath="${BUILT_PRODUCTS_DIR}/GitShareLibrary.txt"
touch "$git_filePath"
echo "$git_sha" > "$git_filePath"

Step3:

子工程IMLibrary添加Git Script,如下圖:


添加Script.png

子工程IMLibrary的Git Script:

#最后一次提交的SHA
git_sha=$(git rev-parse HEAD)
git_filePath="${BUILT_PRODUCTS_DIR}/GitIMLibrary.txt"
touch "$git_filePath"
echo "$git_sha" > "$git_filePath"

Step4:

主工程Git Script如下:

#子工程git信息txt文件路徑
git_filePath_shareLibrary="${BUILT_PRODUCTS_DIR}/GitShareLibrary.txt"
git_filePath_iMLibrary="${BUILT_PRODUCTS_DIR}/GitIMLibrary.txt"

#主工程和子工程的SHA信息
git_sha_uschoolTeacher=$(git rev-parse HEAD)
git_sha_shareLibrary=`cat "$git_filePath_shareLibrary"`
git_sha_imLibrary=`cat "$git_filePath_iMLibrary"`

#把主工程和子工程的SHA拼接起來(lái)
git_sha="UschoolTeacher:$git_sha_uschoolTeacher\n \
IMLibrary:$git_sha_imLibrary\n \
ShareLibrary:$git_sha_shareLibrary"

#獲取App安裝包下的info.plist文件路徑
info_plist="${BUILT_PRODUCTS_DIR}/${EXECUTABLE_FOLDER_PATH}/Info.plist"

#利用PlistBuddy改變info.plist的值
/usr/libexec/PlistBuddy -c "Set :'GitCommitSHA' '${git_sha}'" "${info_plist}"

#刪除生成的git信息txt文件
rm "$git_filePath_shareLibrary"
rm "$git_filePath_iMLibrary"

最后獲取信息:

- (NSDictionary *)p_gitInfoDict {
    NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary];
    NSString *gitSHA = [infoDict objectForKey:@"GitCommitSHA"];
    STDLog(@"gitSHA:%@",gitSHA);
    gitSHA = [@"GitSHA:" stringByAppendingString:(gitSHA == nil ? @"" : gitSHA)];
    NSDictionary *gitDict = @{@"gitSHA" : gitSHA};
    return gitDict;
}

總結(jié):

弄明白編譯過(guò)程中的主工程样悟、子工程之間的順序和Xcode環(huán)境變量拂募,就可以通過(guò)配置腳本在App中獲取到我們要的git信息。
Xcode把兩個(gè)子工程編譯完成后打包成.a文件,

本文引用文章和相關(guān)知識(shí)點(diǎn)鏈接如下:
參考思路
Git提交信息
PlistBuddy簡(jiǎn)單使用
Xcode環(huán)境變量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末窟她,一起剝皮案震驚了整個(gè)濱河市陈症,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌震糖,老刑警劉巖录肯,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吊说,居然都是意外死亡论咏,警方通過(guò)查閱死者的電腦和手機(jī)优炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)厅贪,“玉大人蠢护,你說(shuō)我怎么就攤上這事∝砸纾” “怎么了糊余?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)单寂。 經(jīng)常有香客問(wèn)我贬芥,道長(zhǎng),這世上最難降的妖魔是什么宣决? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任蘸劈,我火速辦了婚禮,結(jié)果婚禮上尊沸,老公的妹妹穿的比我還像新娘威沫。我一直安慰自己,他們只是感情好洼专,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布棒掠。 她就那樣靜靜地躺著,像睡著了一般屁商。 火紅的嫁衣襯著肌膚如雪烟很。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天蜡镶,我揣著相機(jī)與錄音雾袱,去河邊找鬼。 笑死官还,一個(gè)胖子當(dāng)著我的面吹牛芹橡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播望伦,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼林说,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了屯伞?” 一聲冷哼從身側(cè)響起述么,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愕掏,沒(méi)想到半個(gè)月后度秘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年剑梳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了唆貌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡垢乙,死狀恐怖锨咙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情追逮,我是刑警寧澤酪刀,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站钮孵,受9級(jí)特大地震影響骂倘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜巴席,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一历涝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漾唉,春花似錦荧库、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至般此,卻和暖如春蚪战,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背恤煞。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工屎勘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留施籍,地道東北人居扒。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丑慎,于是被迫代替她去往敵國(guó)和親喜喂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 用到的組件 1竿裂、通過(guò)CocoaPods安裝 2玉吁、第三方類庫(kù)安裝 3、第三方服務(wù) 友盟社會(huì)化分享組件 友盟用戶反饋 ...
    SunnyLeong閱讀 14,614評(píng)論 1 180
  • 點(diǎn)上一支香煙 把自己關(guān)在漆黑的小屋里 蟲不鳴 狗不吠 夜色純純 星空澄凈 香煙漫過(guò)窗外 心緒是夜的夢(mèng) 一個(gè)人的...
    金珠瑪咪閱讀 170評(píng)論 1 0
  • 心里的哪種恐懼感又來(lái)了,讓人絕望的是在那恐懼的深處有那么一絲絲的期待悔常! 整個(gè)人已經(jīng)處在崩潰的邊緣影斑,從最先的失望到憤...
    國(guó)王_fcf8閱讀 234評(píng)論 0 0