徹底刪除git倉(cāng)庫(kù)中的包含敏感信息的文件

大家在項(xiàng)目開(kāi)發(fā)中,可能在前期對(duì)安全這塊的意識(shí)不太強(qiáng),往往在工程項(xiàng)目文件中會(huì)包含一些敏感信息文件吕粗,比如:數(shù)據(jù)庫(kù)用戶名密碼、安卓用于打release包的證書(shū)文件等旭愧。然后過(guò)了幾年颅筋,公司的安全部門同事發(fā)現(xiàn)了這個(gè)安全風(fēng)險(xiǎn),于是找到你們需要把那些敏感信息文件從git倉(cāng)庫(kù)中刪除输枯,要不然就讓你上公司的安全通告议泵,扣安全分?jǐn)?shù)。你呵呵一笑桃熄,這還不簡(jiǎn)單先口,把文件刪除然后commit push不就好了,如果再仔細(xì)想想瞳收,我還有很多branch和tags碉京,恩,那我就把每個(gè)branch和tag checkout下來(lái)刪除敏感文件螟深,commit push就好了谐宙, 無(wú)非就多些重復(fù)勞動(dòng)。等你花上幾個(gè)小時(shí)把幾十個(gè)branch和tag修改好后界弧,一個(gè)人靜靜的走到吸煙區(qū)凡蜻,默默的點(diǎn)上一支煙搭综,靜靜的享受剛才的勞動(dòng)成功時(shí),這時(shí)候你情不自禁心里大叫一聲:“我操划栓,我剛才做的沒(méi)用呀设凹,任何一個(gè)人只要把checkout我刪除文件對(duì)應(yīng)的revision之前的revison的話,敏感文件不就又出來(lái)了茅姜∩林欤”,這時(shí)你趕緊掐掉煙蒂钻洒,趕緊回到電腦旁奋姿,打開(kāi)Google,經(jīng)過(guò)10來(lái)分鐘的搜索素标,你終于發(fā)現(xiàn)原來(lái)需要使用git filter-branch這種高級(jí)命令來(lái)處理称诗。OK,說(shuō)干就干头遭。

這里拿一個(gè)簡(jiǎn)單的工程作為例子寓免,我們需要?jiǎng)h除項(xiàng)目中的denny.jks簽名文件,公司的那個(gè)項(xiàng)目差不多快5年了计维,接近2萬(wàn)個(gè)commit袜香,快1000個(gè)分支(很多feature branch沒(méi)有刪),當(dāng)時(shí)花了接近2個(gè)小時(shí)鲫惶。

1. 搞一份新的工程蜈首,到本地

Dennys-MacBook-Pro:tmp denny$ git clone https://git.oschina.net/dengyin2000/YoukuSc2Videos.git
Cloning into 'YoukuSc2Videos'...
remote: Counting objects: 1423, done.
remote: Compressing objects: 100% (1098/1098), done.
remote: Total 1423 (delta 599), reused 355 (delta 101)
Receiving objects: 100% (1423/1423), 17.27 MiB | 240.00 KiB/s, done.
Resolving deltas: 100% (599/599), done.

2. 進(jìn)入項(xiàng)目工程目錄

Dennys-MacBook-Pro:tmp denny$ cd YoukuSc2Videos/

3. 執(zhí)行以下命令

命令中的denny.jks需要你替換成你的刪除的文件路徑,比如你有一個(gè)路徑為app/secret.keystore文件需要?jiǎng)h除欠母,你需要把這個(gè)命令中的denny.jks替換成app/secret.keystore欢策。注意所有的commit歷史紀(jì)錄都會(huì)比改寫(xiě)。

Dennys-MacBook-Pro:YoukuSc2Videos denny$ git filter-branch --force --index-filter \
> 'git rm --cached --ignore-unmatch denny.jks' \
> --prune-empty --tag-name-filter cat -- --all
Rewrite b31fceb5f31a3304b9be785a6c26b4aab5b94a1c (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite 2650d220c6a32ca9a8e6339af7d73f74c1b2bb31 (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite e8e75cef425cdaef8e817dff67f8bbf0074d5210 (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite 10c7b2a62c89eb4715d5a441c284da072fe4eb66 (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite 91e08684de3a8a473a53d8aec5c581e25e7c310c (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite f72c73c78d0085935d6c1eb7184c5d4cf7419fde (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite a500ea50fb23253c8bff343665bc6e7a0b58e18d (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite 13998d5faba90120f968bb52600594b734fa922c (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite 846742285ddbe80aef2d3361685b4cef67bbeed9 (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite 75622643481d3ad53fc1a907053f0422216b9183 (19/59) (1 seconds passed, remaining 2 predicted)    rm 'denny.jks'
Rewrite b099ccc48aa41971f2cbad613ce92be294d73f37 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite edce31b34cda86fc4f12982ce2dea2073afb0d0b (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 679adc119f2128da80c27359620f36cd3235ee69 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 6a819ca0c9d929a1ea976be4ff2d03d7efa74d1c (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 41b08a7a3817d136729a648a84ced6061f3705e7 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 56785a5511adef455cc7d9a0966ec18ccfdf7028 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 49368b04e033ac2ec4538be3088adf2826edb6b3 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite dd504c9b061c4cedc29d16ad20bcf0b254e56cb6 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 6a46d86829e8f87b288ff85dbdfab8008e809c03 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 671cec28c7b7c4e14ebba942fb0f3fff3248debd (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 0e7ed086864af0763b6bbdb7b6f184e854e9b899 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite a4c14502351f2b114d144f13eacff4c942c15159 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 2af54a12e1ba627f846e8ef1fe6e2b988d8cc7e0 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 29bdec57dfb6ac1d6f8a46922f542a0402d9678a (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 3401d2c10250ad15bf7ede6ddf34d8d8134e45c8 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 7a8994e039abd97f090afd1f36a1e352ba3c18bd (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite ef83df70dbee85296eead5528bbfaf7acadd63ab (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 0f1788c4c653656e6a9908c8ee0900f9dd5a39b0 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite ff4f95ef246422398be2118e4ee2019706d25931 (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite 8f751ee11649ab0bd018c3760e2e5ba895427afd (39/59) (2 seconds passed, remaining 1 predicted)    rm 'denny.jks'
Rewrite cd11fed06f0b89fed349107a1830d71c979f94d9 (59/59) (3 seconds passed, remaining 0 predicted)    rm 'denny.jks'

Ref 'refs/heads/master' was rewritten
Ref 'refs/remotes/origin/master' was rewritten
WARNING: Ref 'refs/remotes/origin/master' is unchanged
Ref 'refs/remotes/origin/waps' was rewritten
Ref 'refs/remotes/origin/waps_baiduad' was rewritten

4. 把denny.jks加到.gitignore以防以后又誤操作添加這個(gè)文件赏淌。

Dennys-MacBook-Pro:YoukuSc2Videos denny$ echo "denny.jks"  >> .gitignore
Dennys-MacBook-Pro:YoukuSc2Videos denny$ git add .gitignore 
Dennys-MacBook-Pro:YoukuSc2Videos denny$ git commit -m "add denny.jks to .gitignore"
[master aa4b3fd] add denny.jks to .gitignore
 1 file changed, 1 insertion(+)

5. 切到每個(gè)分支和tag踩寇,確保都已經(jīng)成功清除denny.jks

6. 強(qiáng)制把本地的更改push到git server

Dennys-MacBook-Pro:YoukuSc2Videos denny$ git push origin --force --all
Counting objects: 361, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (202/202), done.
Writing objects: 100% (361/361), 11.22 MiB | 47.00 KiB/s, done.
Total 361 (delta 172), reused 251 (delta 98)
To https://git.oschina.net/dengyin2000/YoukuSc2Videos.git
 + 0f1788c...aa4b3fd master -> master (forced update)

7. 強(qiáng)制push tags

這里我這個(gè)sample工程并沒(méi)有tags,所有并沒(méi)有出現(xiàn)push六水。

Dennys-MacBook-Pro:YoukuSc2Videos denny$ git push origin --force --tags
Everything up-to-date

8. 最后告訴你的同事使用rebase而不是使用merge來(lái)更新他們分支俺孙。如果使用merge可能會(huì)覆蓋你之前做的清理工具。

9. 大家還可以使用BFG Repo-Cleaner這個(gè)工具來(lái)清除git倉(cāng)庫(kù)中的敏感信息文件缩擂,使用這個(gè)工具會(huì)比用git filter-branch命令更快鼠冕,但是靈活性差一點(diǎn)。

Reference:Removing sensitive data from a repository

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胯盯,一起剝皮案震驚了整個(gè)濱河市懈费,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌博脑,老刑警劉巖憎乙,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件票罐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡泞边,警方通過(guò)查閱死者的電腦和手機(jī)该押,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)阵谚,“玉大人蚕礼,你說(shuō)我怎么就攤上這事∩沂玻” “怎么了奠蹬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嗡午。 經(jīng)常有香客問(wèn)我囤躁,道長(zhǎng),這世上最難降的妖魔是什么荔睹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任狸演,我火速辦了婚禮,結(jié)果婚禮上僻他,老公的妹妹穿的比我還像新娘宵距。我一直安慰自己,他們只是感情好中姜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布消玄。 她就那樣靜靜地躺著,像睡著了一般丢胚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上受扳,一...
    開(kāi)封第一講書(shū)人閱讀 49,046評(píng)論 1 285
  • 那天携龟,我揣著相機(jī)與錄音,去河邊找鬼勘高。 笑死峡蟋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的华望。 我是一名探鬼主播蕊蝗,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赖舟!你這毒婦竟也來(lái)了蓬戚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宾抓,失蹤者是張志新(化名)和其女友劉穎子漩,沒(méi)想到半個(gè)月后豫喧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幢泼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年紧显,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缕棵。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孵班,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出招驴,到底是詐尸還是另有隱情重父,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布忽匈,位于F島的核電站房午,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏丹允。R本人自食惡果不足惜郭厌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雕蔽。 院中可真熱鬧折柠,春花似錦、人聲如沸批狐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)嚣艇。三九已至承冰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間食零,已是汗流浹背困乒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贰谣,地道東北人娜搂。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吱抚,于是被迫代替她去往敵國(guó)和親百宇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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