09/19 本篇章節
第五篇 · 19 章
開始使用 Git
- 01 新增、初始 Repository
- 02 把檔案交給 Git 控管
- 03 工作區、暫存區與儲存庫
- 04 檢視紀錄
- 05 【狀況題】如何在 Git 裡刪除檔案或變更檔名?
- 06 【狀況題】修改 Commit 紀錄
- 07 【狀況題】追加檔案到最近一次的 Commit
- 08 【狀況題】新增目錄?
- 09 【狀況題】有些檔案我不想放在 Git 裡面...
- 10 【狀況題】檢視特定檔案的 Commit 紀錄
- 11 【狀況題】等等,這行程式誰寫的?
- 12 【狀況題】啊!不小心把檔案或目錄刪掉了…
- 13 【狀況題】剛才的 Commit 後悔了,想要拆掉重做…
- 14 【狀況題】不小心使用 hard 模式 Reset 了某個 Commit,救得回來嗎?
- 15 【冷知識】HEAD 是什麼東西?
- 16 【狀況題】可以只 Commit 一個檔案的部份的內容嗎?
- 17 【冷知識】那個長得很像亂碼 SHA-1 是怎麼算出來的?
- 18 【超冷知識】在 .git 目錄裡有什麼東西?Part 1 僅收錄於電子書
- 19 【超冷知識】在 .git 目錄裡有什麼東西?Part 2 僅收錄於電子書
第五篇 · 開始使用 Git
【狀況題】有些檔案我不想放在 Git 裡面...
有些比較機密的檔案不想放在 Git 裡面一起備份,例如資料庫的存取密碼或是 AWS 伺服器的存取金鑰…
不只是比較機密的檔案,有時候一些程式編譯的中間檔或暫存檔,因為每次只要一編譯就等於產生一次新的檔案,對專案來說通常沒有實質的利用價值,像這樣的檔案其實也不會想讓它進到 Git 裡。
要做到這件事,只要在專案目錄裡放一個 .gitignore 檔案,並且設定想要忽略的規則就行了。如果這個檔案不存在,就手動新增它:
$ touch .gitignore
然後編輯這個檔案的內容:
# 檔案名稱 .gitignore
# 忽略 secret.yml 檔案
secret.yml
# 忽略 config 目錄下的 database.yml 檔案
config/database.yml
# 忽略所有 db 目錄下附檔名是 .sqlite3 的檔案
/db/*.sqlite3
# 忽略所有附檔名是 .tmp 的檔案
*.tmp
# 當然你要忽略自己也可以,只是通常不會這麼做
# .gitignore
只要 .gitignore 這個檔案存在,即使這個檔案沒被 Commit 或是沒被 Push 上 Git Server 就會有效果。但這個檔案會建議 Commit 進專案並且推上 Git Server,這樣一來整個專案一起開發的人可以共享相同的設定。
在新增檔案的時候,一旦只要符合 .gitignore 檔案裡的規定,這個檔案就會被忽視。例如,現在的狀態是剛剛 Commit 完,暫存區跟工作目錄都是乾淨的:
$ git status
On branch master
nothing to commit, working tree clean
這時候,故意加入會被忽略的檔案 secret.yml:
$ touch secret.yml
再看一下狀態:
$ git status
On branch master
nothing to commit, working tree clean
這個檔案雖然現在確實存在這個目錄裡,但 Git 已經感應不到它了,也就是說它被 Git 無視了。
如果你不知道你在使用的工具或程式語言通常會忽略哪些檔案,GitHub 上有整理了一份各種程式語言常見的 .gitignore 檔案。
網址: https://github.com/github/gitignore
可以忽略這個忽略嗎?
雖然 .gitignore 這個檔案有列了一些忽略的規則,但其實也是可以忽略這個忽略的規則。只要在 git add 的時候再加上 -f 的參數:
$ git add -f 檔案名稱
就可以無視規則,強迫闖關。
咦?怎麼沒效果?
以上面這個例子來說,這個專案裡剛好有個 config 目錄,裡面剛好有個 database.yml 檔,完全符合被忽略的規則。所以照理說這個修改應該要被無視,但編輯 database.yml 之後卻會發現:
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: config/database.yml
狀態竟然變成 modified 了!不是說會無視嗎?
這是因為這個 config/database.yml 檔案,在 .gitignore 之前就存在了。.gitignore 檔案設定的規則,只對在規則設定之後的有效,那些已經存在的檔案就像既得利益者一樣,這些規則是對他們沒有效果的。
如果想套用 .gitignore 的規則,就必須先使用 git rm --cached 指令把這些既得利益者請出 Git,移出 Git 控管之後,它就會開始會被忽略了。
Git 教學: 該如何清除忽略的檔案?
如果想要一口氣清除那些已經被忽略的檔案,可以使用 git clean 指令並配合 -X 參數:
$ git clean -fX
那個額外加上的 -f 參數是指強制刪除的意思,這樣一來就可清除那些被忽略的檔案。