首頁 > 軟體

Git中使用.gitignore忽略檔案的推播方式

2023-02-14 06:02:25

1 簡介

在使用Git管理自己的程式碼版本時,由於編譯生成的中間檔案,Git使用SHA-1演演算法來對檔案進行加密,進而得出來一個40位的十六進位制加密字串。

325525d8b1f67b5ddd37956a8a728fd26c4ba5ce

但這種演演算法對於文字檔案有效,對於二進位制之類的檔案則無法正常的進行加密。

因此Git版本管理多管理文字檔案,而非二進位制之類的檔案,例如obj檔案、.class檔案,,並且一些敏感檔案和臨時檔案、紀錄檔檔案是不能上傳到Git遠端倉庫中的。

在Git中提供了.gitignore檔案,可以制定自己忽略檔案。

比如說使用IDEA整合式開發環境編寫一個專案,在專案根路徑下,檔案結構如下:

在上圖中,由IDEA開發的專案的目錄結構如上圖所示,其中target目錄存放的是專案編譯產生的檔案,而.idea目錄則是特定於IDEA整合式開發環境的檔案。

demo.iml檔案也不需要上傳到Git。

2 Git忽略檔案提交方法

由於作者在撰寫本文時使用IDEA開發,因此以忽略某些IDEA開發環境的特定檔案做例子演示

2.1 在Git專案中定義 .gitignore 檔案

2.1.1 初始化git倉庫

首先開啟Git Bash,並且切換到demo根目錄,執行git init讓git管理該目錄。

$ ls -la
total 48
drwxr-xr-x 1 全恆 197609    0 9月  27 09:44 ./
drwxr-xr-x 1 全恆 197609    0 9月  27 09:45 ../
drwxr-xr-x 1 全恆 197609    0 9月  27 09:38 .idea/
drwxr-xr-x 1 全恆 197609    0 8月  29 23:52 .mvn/
-rw-r--r-- 1 全恆 197609 8205 9月  18 17:08 demo.iml
-rwxr-xr-x 1 全恆 197609 6468 8月  22 09:03 mvnw*
-rw-r--r-- 1 全恆 197609 4994 8月  22 09:03 mvnw.cmd
-rw-r--r-- 1 全恆 197609 2707 9月  18 17:06 pom.xml
drwxr-xr-x 1 全恆 197609    0 8月  29 23:52 src/
drwxr-xr-x 1 全恆 197609    0 8月  29 23:52 target/
-rw-r--r-- 1 全恆 197609 5162 8月  28 21:11 zioer5.iml

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo
$ git init
Initialized empty Git repository in D:/Git/demo/demo/.git/

2.1.2 新增遠端倉庫路徑

新增遠端倉庫,在GitHub上建立repository,demo。拷貝遠端倉庫目錄:

git@github.com:yanchenmochen/demo.git

在demo目錄執行命令如下:

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ git remote add origin git@github.com:yanchenmochen/demo.git

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ git remote -v
origin  git@github.com:yanchenmochen/demo.git (fetch)
origin  git@github.com:yanchenmochen/demo.git (push)

然後執行git add .,和執行git commit –m “first commit”,表示該專案的所有檔案均被git管理。

2.1.3 新建.gitignore組態檔

在當前目錄生成檔案.gitignore,並在其中新增要忽略的檔案或目錄,每行表示一個忽略規則。

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ vim .gitignore

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ cat .git
.git/       .gitignore

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ cat .gitignore
target/
*.iml
.idea/

2.1.4 git管理.gitignore

在上述的程式碼片段中新建了組態檔.gitignore,然後忽略了target目錄,.idea目錄,以字尾.iml結尾的檔案。

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

        .gitignore

nothing added to commit but untracked files present (use "git add" to track)

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ git add .gitignore
warning: LF will be replaced by CRLF in .gitignore.
The file will have its original line endings in your working directory.

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   .gitignore


全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ git commit -m "[ADD]新增.gitignore組態檔"
[master 202e7b0] [ADD]新增.gitignore組態檔
 1 file changed, 3 insertions(+)
 create mode 100644 .gitignore

上述的程式碼片段讓Git管理了檔案.gitignore,並且執行了一次提交,提交到本地倉庫。

2.1.5 讓Git識別該組態檔

使用命令git config設定忽略組態檔.gitignore。

git config core. excludesfile .gitignore

與設定使用者名稱和郵箱是一樣的。

$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
[remote "origin"]
        url = git@github.com:yanchenmochen/demo.git
        fetch = +refs/heads/*:refs/remotes/origin/*


全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ git config core.excludesfile .gitignore

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
        excludesfile = .gitignore
[remote "origin"]
        url = git@github.com:yanchenmochen/demo.git
        fetch = +refs/heads/*:refs/remotes/origin/*

2.1.6 推播到遠端

全恆@Lenovo-PC MINGW64 /d/Git/demo/demo (master)
$ git push origin master
Enumerating objects: 155, done.
Counting objects: 100% (155/155), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (138/138), done.
Writing objects: 100% (155/155), 83.41 KiB | 749.00 KiB/s, done.
Total 155 (delta 69), reused 0 (delta 0)
remote: Resolving deltas: 100% (69/69), done.
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/yanchenmochen/demo/pull/new/master
remote:
To github.com:yanchenmochen/demo.git
 * [new branch]      master -> master

2.1.7 網頁檢視上傳的檔案

在這裡我們發現,.idea目錄,target目錄,demo.iml檔案等我們想要忽略的檔案。

2.1.8 .gitignore不生效

.gitignore只能忽略那些原來沒有被track的檔案,如果某些檔案已經被納入了版本管理中,則修改.gitignore是無效的。這是因為在之前,自己直接使用git add .把所有的檔案,包括target目錄,.idea目錄,然後執行了

git config core.excludesfile ***

.gitignore只能忽略原來沒有被跟蹤的檔案,因此跟蹤過的檔案是無法被忽略的。因此在網頁上可以看到target等目錄的存在。

解決方法就是先把本地快取刪除(改變成未track狀態),然後再提交:

git rm -r --cached .
git add .
git commit -m ‘update .gitignore’

2.1.9 再次推播

$ git push origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 232 bytes | 232.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To github.com:yanchenmochen/demo.git
   202e7b0..9f4fc9c  master -> master

2.1.10 驗證

登陸網頁,檢視本次提交:

2.2 定義Git全域性的.gitignore檔案

如果一直使用某個開發工具進行開發專案,則相對於特定專案的忽略檔案,所有的專案均要忽略的檔案,則可以使用設定全域性忽略檔案。

使用命令

git config --global core.excludesfile ~/.gitignore

該設定資訊位於~/.gitignore。

整體的操作步驟與上述特定於專案的.gitignore是一致的,不再贅述。

2.3 在Git專案的設定中指定排除檔案

這種方式只是臨時指定該專案的行為,需要編輯當前專案下的 .git/info/exclude 檔案,然後將需要忽略提交的檔案寫入其中。

需要注意的是,這種方式指定的忽略檔案的根目錄是專案根目錄。

3 忽略規則

在 .gitignore 檔案中,每一行的忽略規則的語法如下:

  • 空格不匹配任意檔案,可作為分隔符,可用反斜槓跳脫
  • #開頭的檔案標識註釋,可以使用反斜槓進行跳脫
  • ! 開頭的模式標識否定,該檔案將會再次被包含,如果排除了該檔案的父級目錄,則使用 ! 也不會再次被包含。可以使用反斜槓進行跳脫
  • / 結束的模式只匹配資料夾以及在該資料夾路徑下的內容,但是不匹配該檔案
  • / 開始的模式匹配專案跟目錄
  • 如果一個模式不包含斜槓,則它匹配相對於當前 .gitignore 檔案路徑的內容,如果該模式不在 .gitignore 檔案中,則相對於專案根目錄
  • ** 匹配多級目錄,可在開始,中間,結束
  • ? 通用匹配單個字元
  • [] 通用匹配單個字元列表

4 總結

Git在程式設計師開發過程中,不可或缺,因此熟練掌握Git的方方面面,對於提升自己的個人素養和開發效率,不可或缺。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com