簡體   English   中英

您是否忽略 your.gitignore 中的 git 子模塊或將其提交到您的倉庫?

[英]Do you ignore a git submodule in your .gitignore or commit it to your repo?

現在,每次運行git status時,我都在project_dir/vendor/submodule_one的項目中添加了一個子模塊,我得到了modified: vendor/submodule_one (new commits)

我的問題是處理這個問題的最佳方法是什么? 我是否將vendor/submodule_one -文件夾添加到我的.gitignore中,因為我的主項目不需要知道我的子模塊的細節?

或者當我更改並提交對我的子模塊的更改時,我是否還需要在我的主項目中進行提交?

剛剛開始使用子模塊,除了設置它們之外似乎找不到太多信息。

不,您不需要將子模塊添加到.gitignore :父模塊將從您的子模塊中看到的是gitlink特殊條目, mode 160000 )。

這意味着:在子模塊中直接進行的任何更改都需要在父目錄中進行提交。
這樣,父目錄就會為子模塊的狀態記錄正確的提交:那個提交就是上面提到的“gitlink”;

您可以在“ git submodule update (true nature of submodules) ”中閱讀有關該政策的更多信息。
子模塊背后的主要思想是基於組件的方法,您可以在特定提交時引用其他存儲庫。 但是,如果您更改了這些子模塊中的任何內容,則還需要更新父存儲庫中的這些引用。


請注意,在 Git 2.13(2017 年第二季度)中,雖然忽略 gitlink,但您仍然可以忽略子模塊:

git config submodule.<name>.active false

在“忽略 git 子模塊的新提交”中查看更多信息。


注意:對於 Git 2.15.x/2.16(2018 年第一季度),忽略子模塊更准確。
git status --ignored --untracked ”並沒有停留在一個單獨項目的工作樹上,該項目嵌入在一個被忽略的目錄中,並在該其他項目中列出了文件,而不僅僅是將目錄本身顯示為被忽略。

請參閱Johannes Schindelin ( dscho ) 提交的 fadb482 (2017 年 10 月 25 日)
(由Junio C gitster合並-- gitster -- in commit da7996a ,2017 年 11 月 6 日)

status :不要被排除目錄中的子模塊混淆

我們treat_directory()地將exclude標志傳遞給treat_directory()函數,以便我們可以在treat_directory()指示其中的文件被排除而不是未跟蹤。

但是我們還沒有以同樣的方式對待子模塊。

因此, git status --ignored --untracked with a submodule submodule in a gitignored tracked/將在“ Untracked files ”部分顯示子模塊,例如

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

    tracked/submodule/

Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/initial.t

相反,我們希望它在“ Ignored files ”部分顯示子模塊:

On branch master
Ignored files:
  (use "git add -f <file>..." to include in what will be committed)

    tracked/submodule/

出於某種原因submodule.module-name.active對我不起作用。

這就是為什么我使用submodule.module-name.ignore

git config submodule.<your module path>.ignore all

https://git-scm.com/docs/gitmodules - 在這里您可以找到參數可能值的描述

適用於(新提交)和(修改內容)消息。

要添加到已接受的答案中,我發現將 Git 子模塊文件夾添加到 .gitignore 實際上會導致問題 - 特別是在嘗試創建項目的新克隆時。 具體來說,運行正常的子模塊克隆命令會導致子模塊文件夾為空:

git submodule init
git submodule update
git pull --recurse-submodules

只能通過嘗試重新運行

git submodule add <Git repo> <submodule folder>

根據輸出,問題很明顯:

The following path is ignored by one of your .gitignore files:
<submodule folder>
Use -f if you really want to add it.

我沒有添加-f ,而是從 .gitignore 中刪除了 Git 子模塊文件夾並重新運行子模塊克隆命令 - 現在成功創建了該文件夾。 我認為可能存在一個錯誤,即其中一個子模塊克隆命令尊重 .gitignore 但沒有警告它相應地跳過子模塊。

git config submodule.<name>.ignroe all

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM