嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

讓你的 commit 更有價(jià)值

2020-7-29    seo達(dá)人

提交規(guī)范

AngularJS 在開發(fā)者文檔中關(guān)于 git commit 的指導(dǎo)說(shuō)明,提到嚴(yán)格的 git commit 格式規(guī)范可以在瀏覽項(xiàng)目歷史的過(guò)程中看到更易讀的信息,并且能用 git commit 的信息直接生成 AngularJS 的 change log 。


commit messages 格式規(guī)范

commit messages 由 header 、body 、footer 組成。


header 又包含 type 、scope 、subject 。header 是必需的,不過(guò)其中的 scope 是可選的。


body 和 footer 可以省略。


<type>(<scope>): <subject>

// 空行

<BLANK LINE>

<body>

// 空行

<BLANK LINE>

<footer>

注:為了能在 github 以及各種 git 工具中看得更清晰,commit messages 的每一行都不要超過(guò) 100 個(gè)字符。

Header

Type

類型必須是以下幾種之一:


feat: 新功能

fix: bug 修復(fù)

docs: 僅修改文檔

style: 修改格式(空格,格式化,省略分號(hào)等),對(duì)代碼運(yùn)行沒(méi)有影響

refactor: 重構(gòu)(既不是修 bug ,也不是加功能)

build: 構(gòu)建流程、外部依賴變更,比如升級(jí) npm 包、修改 webpack 配置等

perf: 性能優(yōu)化

test: 測(cè)試相關(guān)

chore: 對(duì)構(gòu)建過(guò)程或輔助工具和庫(kù)(如文檔生成)的更改

ci: ci 相關(guān)的更改

除此之外,還有一個(gè)特殊的類型 revert ,如果當(dāng)前提交是為了撤銷之前的某次提交,應(yīng)該用 revert 開頭,后面加上被撤銷的提交的 header,在 body 中應(yīng)該注明: This reverts commit <hash>. ,hash 指的就是將要被撤銷的 commit SHA 。


// 例如


revert: feat(user): add user type


This reverts commit ca16a365467e17915f0273392f4a13331b17617d.

Scope

scope 可以指定提交更改的影響范圍,這個(gè)視項(xiàng)目而定,當(dāng)修改影響超過(guò)單個(gè)的 scope 時(shí),可以指定為 * 。


Sbuject

subject 是指更改的簡(jiǎn)潔描述,長(zhǎng)度約定在 50 個(gè)字符以內(nèi),通常遵循以下幾個(gè)規(guī)范:


用動(dòng)詞開頭,第一人稱現(xiàn)在時(shí)表述,例如:change 代替 changed 或 changes

第一個(gè)字母小寫

結(jié)尾不加句號(hào)(.)

Body

body 部分是對(duì)本地 commit 的詳細(xì)描述,可以分成多行。


跟 subject 類似,用動(dòng)詞開頭,第一人稱現(xiàn)在時(shí)表述,例如:change 代替 changed 或 changes。


body 應(yīng)該說(shuō)明修改的原因和更改前后的行為對(duì)比。


Footer

footer 基本用在這兩種情況:


不兼容的改動(dòng)( Breaking Changes ),通常用 BREAKING CHANGE: 開頭,后面跟一個(gè)空格或兩個(gè)換行符。剩余的部分就是用來(lái)說(shuō)明這個(gè)變動(dòng)的信息和遷移方法等。

關(guān)閉 Issue, github 關(guān)閉 Issue 的例子

// BREAKING CHANGE: 的例子

BREAKING CHANGE: isolate scope bindings definition has changed and

   the inject option for the directive controller injection was removed.


   To migrate the code follow the example below:


   Before:


   scope: {

     myAttr: 'attribute',

     myBind: 'bind',

     myExpression: 'expression',

     myEval: 'evaluate',

     myAccessor: 'accessor'

   }


   After:


   scope: {

     myAttr: '@',

     myBind: '@',

     myExpression: '&',

     // myEval - usually not useful, but in cases where the expression is assignable, you can use '='

     myAccessor: '=' // in directive's template change myAccessor() to myAccessor

   }


   The removed `inject` wasn't generaly useful for directives so there should be no code using it.




// Closes Issue 例子

Closes #2314, #3421

完整的例子

例一: feat

feat($browser): onUrlChange event (popstate/hashchange/polling)


Added new event to $browser:

- forward popstate event if available

- forward hashchange event if popstate not available

- do polling when neither popstate nor hashchange available


Breaks $browser.onHashChange, which was removed (use onUrlChange instead)

例二: fix

fix($compile): couple of unit tests for IE9


Older IEs serialize html uppercased, but IE9 does not...

Would be better to expect case insensitive, unfortunately jasmine does

not allow to user regexps for throw expectations.


Closes #392

Breaks foo.bar api, foo.baz should be used instead

例三: style

style($location): add couple of missing semi colons

查看更多例子

規(guī)范 commit message 的好處

首行就是簡(jiǎn)潔實(shí)用的關(guān)鍵信息,方便在 git history 中快速瀏覽

具有詳實(shí)的 body 和 footer ,可以清晰的看出某次提交的目的和影響

可以通過(guò) type 過(guò)濾出想要查找的信息,也可以通過(guò)關(guān)鍵字快速查找相關(guān)提交

可以直接從 commit 生成 change log

// 列舉幾個(gè)常用的 log 參數(shù)


// 輸出 log 的首行

git log --pretty=oneline


// 只輸出首行的 commit 信息。不包含 hash 和 合并信息等

git log --pretty=format:%s


// 查找有關(guān)“更新菜單配置項(xiàng)”的提交

git log --grep="更新菜單配置項(xiàng)"


// 打印出 chenfangxu 的提交

git log --author=chenfangxu


// 紅色的短 hash,黃色的 ref , 綠色的相對(duì)時(shí)間

git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr)%Creset'

用工具實(shí)現(xiàn)規(guī)范提交

上面介紹了規(guī)范提交的格式,如果讓各位同學(xué)在 git commit 的時(shí)候嚴(yán)格按照上面的規(guī)范來(lái)寫,首先心智是有負(fù)擔(dān)的,得記住不同的類型到底是用來(lái)定義什么的,subject 怎么寫,body 怎么寫,footer 要不要寫。其次,對(duì)人的規(guī)范大部分都是反人性的,所以很可能在過(guò)不了多久,就會(huì)有同學(xué)漸漸的不按照規(guī)范來(lái)寫。靠意志力來(lái)控制自己嚴(yán)格按照規(guī)范來(lái)寫是需要額外耗費(fèi)一些精力的,把精力耗費(fèi)在這種事情上面實(shí)在有些浪費(fèi)。


用工具實(shí)現(xiàn)規(guī)范提交的方案,一種是在提交的時(shí)候就提示必填字段,另一種是在提交后校驗(yàn)字段是否符合規(guī)范。這兩種在實(shí)際項(xiàng)目中都是很有必要的。


Commitizen

Zen-like commit messages for internet citizens. 嗯~~一種禪意

Commitizen 是一個(gè)幫助撰寫規(guī)范 commit message 的工具。他有一個(gè)命令行工具 cz-cli,接下來(lái)會(huì)把使用 Commitizen 分成幾個(gè)階段來(lái)介紹。


體驗(yàn) git cz

// 全局安裝 Commitizen

npm install -g commitizen

你的倉(cāng)庫(kù)可能還不是對(duì) Commitizen 友好的,此時(shí)運(yùn)行 git cz 的效果跟 git commit 一樣,也就是沒(méi)有效果。 不過(guò),可以執(zhí)行 npx git-cz 來(lái)體驗(yàn)。


如果想直接運(yùn)行 git cz 實(shí)現(xiàn)語(yǔ)義化的提交,可以根據(jù) streamich/git-cz 文檔中說(shuō)的全局安裝 git cz。


// 全局安裝 git cz

npm install -g git-cz

除此之外還有一種更推薦的方式,就是讓你的倉(cāng)庫(kù)對(duì) Commitizen 友好。


Commitizen 友好

全局安裝 Commitizen 后,用 cz-conventional-changelog 適配器來(lái)初始化你的項(xiàng)目


// 初始化 cz-conventional-changelog 適配器

commitizen init cz-conventional-changelog --save-dev --save-exact

上面的初始化做了三件事:


安裝 cz-conventional-changelog 依賴

把依賴保存到 package.json 的 dependencies 或 devDependencies 中

在根目錄的 package.json 中 添加如下所示的 config.commitizen

"config": {

   "commitizen": {

     "path": "./node_modules/cz-conventional-changelog"

   }

 }

或者,在項(xiàng)目根目錄下新建一個(gè) .czrc 文件,內(nèi)容設(shè)置為


{

 "path": "cz-conventional-changelog"

}

現(xiàn)在運(yùn)行 git cz 效果如下:




cz-customizable 自定義中文配置

通過(guò)上面的截圖可以看到,提交的配置選項(xiàng)都是英文的,如果想改成中文的,可以使用 cz-customizable 適配器。


運(yùn)行下面的命令,注意之前已經(jīng)初始化過(guò)一次了,這次再初始化,需要加 --force 覆蓋


npm install cz-customizable --save-dev


commitizen init cz-customizable --save-dev --save-exact --force

現(xiàn)在 package.json 中 config.commitizen 字段為:


"config": {

   "commitizen": {

     "path": "./node_modules/cz-customizable"

   }

 }

cz-customizable 文檔中說(shuō)明了查找配置文件的方式有三種,我們按照第一種,在項(xiàng)目根目錄創(chuàng)建一個(gè) .cz-config.js 的文件。按照給出的示例 cz-config-EXAMPLE.js 編寫我們的 config。 commit-type 可以參考 conventional-commit-types 。


可以點(diǎn)擊查看我配置好的文件 qiqihaobenben/commitizen-git/.cz-config.js ,里面中詳細(xì)的注釋。


commitlint 校驗(yàn)提交

Commitizen 文檔中開始就介紹到,Commitizen 可以在觸發(fā) git commit 鉤子之前就能給出提示,但是也明確表示提交時(shí)對(duì) commit messages 的校驗(yàn)也是很有用的。畢竟即使用了 Commitzen,也是能繞過(guò)去,所以提交最后的校驗(yàn)很重要。


commitlint 可以檢查 commit messages 是否符合常規(guī)提交格式,需要一份校驗(yàn)配置,推薦 @commitlint/config-conventional 。


npm i --save-dev @commitlint/config-conventional @commitlint/cli

在項(xiàng)目根目錄創(chuàng)建 commitlint.config.js 文件并設(shè)置校驗(yàn)規(guī)則:


module.exports = {

 extends: ["@commitlint/config-conventional"],

 // rules 里面可以設(shè)置一些自定義的校驗(yàn)規(guī)則

 rules: {},

};

在項(xiàng)目中安裝 husky ,并在項(xiàng)目根目錄新建 husky.config.js 文件,加入以下設(shè)置:


// 安裝 husky

npm install --save-dev husky



// husky.config.js 中加入以下代碼

module.exports = {

 "hooks": {

   "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"

 }

}

注意:因?yàn)?@commitlint/config-conventional 校驗(yàn)規(guī)則遵循 Angular 的規(guī)范, 所以我們?cè)谟?cz-customizable 自定義中文配置時(shí), 是按照給出的符合 Angular 規(guī)范的示例 cz-config-EXAMPLE.js 編寫.cz-config.js 的。但是如果你自定義的 Commitizen 配置不符合 Angular 規(guī)范,可以使用 commitlint-config-cz 設(shè)置校驗(yàn)規(guī)則。(推薦還是按照 Angular 規(guī)范進(jìn)行 cz-customizable 自定義配置)

// 安裝 commitlint-config-cz

npm install commitlint-config-cz --save-dev



// commitlint.config.js 改為

module.exports = {

 extends: [

   'cz'

 ]

};

git commit 觸發(fā) git cz

在提交的時(shí)候,我們都習(xí)慣了 git commit ,雖然換成 git cz 不難,但是如果讓開發(fā)者在 git commit 時(shí)無(wú)感知的觸發(fā) git cz 肯定是更好的,

而且也能避免不熟悉項(xiàng)目的人直接 git commit 提交一些不符合規(guī)范的信息。


我們可以在 husky.config.js 中設(shè)置:


"hooks": {

 "prepare-commit-msg": "exec < /dev/tty && git cz --hook || true",

}

注意: 在 window 系統(tǒng),可能需要在 git base 中才能生效。

生成 CHANGELOG

standard-version

是一個(gè)使用 semver 和 conventional-commits 支持生成 CHANGELOG 進(jìn)行版本控制的實(shí)用程序。

standard-version 不只是能生成 CHANGELOG , 還能根據(jù) commit 的 type 來(lái)進(jìn)行版本控制。


// 安裝 standard-verison

npm i --save-dev standard-version


// 在 package.json 中的 scripts 加入 standard-version

{

 "scripts": {

   "release": "standard-version"

 }

}

示例項(xiàng)目

可以查看 commitizen-git ,里面歸納了快速配置 Commitizen 友好倉(cāng)庫(kù)的步驟。

差不多三五分鐘就能搞定。


可以看一下配置完后,執(zhí)行 git commit 的效果。




擴(kuò)展

更復(fù)雜的自定義提示

cz-customizable 中自定義配置項(xiàng)通常情況是夠用的,

commitlint 中校驗(yàn)的規(guī)則基本上也是夠用的,但是會(huì)有比較硬核的開發(fā)者會(huì)覺(jué)得還是不夠,還要更多。比如一些 prompt 更加自定義,

提交時(shí)詢問(wèn)的 question 添加更多的邏輯,比如可以把一些重要的字段校驗(yàn)提前到 Commitizen 中,或者添加更多自定義的校驗(yàn)。


如果真想這么干,那就去 fork 一份 cz-conventional-changelog 或者 cz-customizable 來(lái)改,

或者直接自己寫一個(gè) adapter。


Commitizen 友好徽章

如果把倉(cāng)庫(kù)配置成了對(duì) Commitizen 友好的話,可以在 README.md 中加上這個(gè)小徽章

藍(lán)藍(lán)設(shè)計(jì)www.sdgs6788.com )是一家專注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶體驗(yàn) 、交互設(shè)計(jì)、 網(wǎng)站建設(shè) 平面設(shè)計(jì)服務(wù)

日歷

鏈接

個(gè)人資料

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 亚洲一区三区电影在线观看| 午夜在线播放视频欧美| 欧美理论在线| 欧美黄色一区二区| 欧美精品色综合| 欧美日韩亚洲网| 国产精品色网| 狠狠综合久久av一区二区小说| 国产一区视频在线观看免费| 亚洲电影在线播放| 亚洲素人在线| 久久久欧美精品| 国产欧美在线播放| 好吊妞**欧美| 99视频有精品| 久久午夜电影| 亚洲欧洲美洲综合色网| 一区二区三区免费看| 久久精品日产第一区二区| 欧美成黄导航| 国产美女一区二区| 亚洲免费高清| 久久性天堂网| av成人老司机| 久久天堂成人| 国产免费一区二区三区香蕉精| 1769国内精品视频在线播放| 亚洲一区日韩在线| 欧美国产第一页| 亚洲欧美日韩爽爽影院| 欧美精品www| 在线欧美日韩| 久久成人免费电影| 一本色道久久综合亚洲精品婷婷| 久久一区欧美| 国产日韩欧美综合一区| 中文无字幕一区二区三区| 免费91麻豆精品国产自产在线观看| 一区二区高清视频在线观看| 美女999久久久精品视频| 国产女人精品视频| 亚洲香蕉在线观看| 亚洲精品日韩综合观看成人91| 久久久久久综合网天天| 国产美女精品免费电影| 在线亚洲一区二区| 亚洲国产99精品国自产| 久久精品日韩欧美| 国产目拍亚洲精品99久久精品| 中文精品在线| 亚洲三级视频在线观看| 欧美成人一品| 亚洲精品国产精品国自产观看浪潮| 久久免费精品视频| 欧美自拍偷拍| 黄色精品在线看| 久久先锋资源| 久久精品夜色噜噜亚洲a∨| 国产一二三精品| 久久亚洲国产精品一区二区 | 欧美一区二区三区播放老司机 | 亚洲一级一区| 日韩亚洲在线观看| 欧美日韩久久精品| 亚洲作爱视频| 一本久久综合| 国产精品久久久久9999吃药| 国产乱码精品一区二区三区不卡| 亚洲手机视频| 亚洲午夜精品一区二区三区他趣 | 亚洲高清视频在线| 欧美国产视频在线观看| 欧美黑人在线观看| 洋洋av久久久久久久一区| 夜夜嗨av一区二区三区中文字幕| 欧美日韩综合另类| 久久国产视频网| 久热精品在线| 在线视频精品一区| 亚洲欧美精品一区| 精品福利av| 夜夜爽夜夜爽精品视频| 国产精品一区二区三区久久久| 久久国产福利| 欧美+亚洲+精品+三区| 一区二区黄色| 欧美一区国产一区| 日韩视频在线一区二区三区| 中文欧美日韩| 亚洲夫妻自拍| 在线亚洲观看| 伊人一区二区三区久久精品| 亚洲国产一区二区三区青草影视| 欧美日韩在线一区二区| 老司机免费视频一区二区三区| 欧美精品一区二区三区在线播放| 欧美一区二区三区精品| 嫩模写真一区二区三区三州| 午夜精品区一区二区三| 女女同性精品视频| 久久精品国产2020观看福利| 欧美激情在线观看| 久久一区免费| 欧美午夜精品久久久久免费视| 久久免费视频在线观看| 欧美三级网页| 欧美高清视频免费观看| 国产欧美一区二区精品婷婷| 亚洲国产成人av好男人在线观看| 国产精品一二一区| 91久久精品www人人做人人爽 | 亚洲免费小视频| 蜜乳av另类精品一区二区| 欧美亚洲一区二区在线| 欧美日韩国产综合新一区| 久久综合久久综合九色| 国产精品乱码人人做人人爱| 亚洲高清一二三区| 激情伊人五月天久久综合| 亚洲在线不卡| 亚洲小说区图片区| 欧美激情一区在线| 亚洲成人资源网| 尤物九九久久国产精品的特点| 亚洲欧美中文在线视频| 亚洲一区久久| 国产精品theporn88| 9色国产精品| 亚洲视频综合在线| 欧美特黄视频| 亚洲精品在线免费| 国产精品成人v| 亚洲精品国产拍免费91在线| 亚洲精美视频| 欧美电影免费观看大全| 欧美激情中文字幕乱码免费| 亚洲国产精品福利| 久久一区亚洲| 欧美激情久久久| 亚洲毛片一区| 欧美日本国产一区| 日韩一级网站| 亚洲欧美视频在线| 国产亚洲精品美女| 亚洲欧美日韩精品| 久久久精品午夜少妇| 国产在线乱码一区二区三区| 久久久久久自在自线| 欧美国产日韩一区二区三区| 亚洲精品乱码久久久久久蜜桃91| 欧美精品粉嫩高潮一区二区| 一区二区精品在线| 欧美亚洲网站| 在线精品国产欧美| 欧美日韩xxxxx| 亚洲婷婷综合久久一本伊一区| 欧美一区二区视频在线| 国内精品一区二区| 欧美韩日视频| 亚洲一区二区黄| 玖玖玖免费嫩草在线影院一区| 最近中文字幕mv在线一区二区三区四区 | 欧美在线亚洲综合一区| 狠狠色丁香婷婷综合影院| 欧美成人国产| 亚洲一区视频| 欧美成人免费在线视频| 在线午夜精品自拍| 国产一区二区毛片| 欧美韩国一区| 欧美在线影院| 夜夜爽www精品| 久热成人在线视频| 亚洲一级网站| 亚洲黄色三级| 国产欧美日韩一区二区三区在线观看 | 一区二区三区 在线观看视频| 国产精品欧美经典| 欧美成人黄色小视频| 午夜在线不卡| 91久久线看在观草草青青| 久久激情综合网| 日韩一区二区精品视频| 狠狠狠色丁香婷婷综合久久五月 | 亚洲图片欧美一区| 欧美激情1区2区| 久久久999精品免费| 在线性视频日韩欧美| 亚洲激情黄色| 一区二区三区在线观看视频| 国产精品免费看| 一区二区日韩| 国产精品久久午夜| 欧美金8天国| 久久亚洲风情| 欧美一区2区视频在线观看| 99人久久精品视频最新地址| 亚洲第一在线视频| 免费欧美在线视频| 久久精品国产亚洲5555|