簡體   English   中英

為什么 GitLab 將我的項目的一個文件夾保存為子項目提交?

[英]Why has GitLab saved one folder of my project as a Subproject commit?

我已經開始開發一個網站,保存在我的本地文件夾中,我正在嘗試將其保存到 GitLab 存儲庫中。 我在 GitLab 上創建了一個新存儲庫,然后執行以下操作:

cd existing_folder
git init --initial-branch=main
git remote add origin https://gitlab.com/...
git add .
git commit -m "Initial commit"
git push -u origin main

該項目包含兩個文件夾,Server 和 Client,Client 是一個 React App。 但是,客戶端文件夾顯示為無法打開的紅色文件夾圖標:

1

當我單擊初始提交時,它說客戶端已添加為子項目提交:

2

不知道這是什么意思,我之前也建過類似結構的網站,Gitlab沒有做過。 我只想將 Client 和 Server 文件夾的內容保存在 repo 中。

我的猜測是您在錯誤的文件夾中執行 git 初始化。 現在您的客戶端文件夾可能是實際頂部 git 存儲庫的子模塊。

檢查您的客戶端文件夾中是否有 hidden.git 目錄

要解決此問題,請刪除 Client 目錄中的 .git 文件夾。 還要檢查頂部文件夾中名為sumodule的文件,如果存在則將其刪除。

你做了什么:

  • 創建了一個包含應用程序客戶端的Git 存儲庫,並向其中提交了一些內容。 此存儲庫位於client/.git/中。 它包含的文件可能命名為main.js等(或main.ts等,如果 TypeScript 等)。

  • .git中創建了第二個總體 Git 存儲庫,其中包含應用程序的服務器端,並為此提交了一些內容。 此存儲庫位於.git/並包含名為server/functions.js的文件等。 Git 將把第二個總體存儲庫稱為superproject 它只是一個 Git 存儲庫,盡管它具有一個特殊屬性。

請注意,就 Git 而言,文件夾甚至不存在:文件中只有帶有嵌入斜杠的名稱——總是斜杠,從不反斜杠——在其中。 Git 將根據需要將這些轉換為操作系統所需的文件夾和文件排列。 這也處理了操作系統需要的任何反斜杠(例如,在 Windows 上將名稱從foo/bar.js轉換為foo\bar.js )。 但在大多數情況下,這是不可見的,我們可以假裝我們有一個裝滿文件的文件夾; 無論如何,我們將使用從提交中提取的操作系統級文件,這些文件實際上是文件夾中的文件。 因此,對於 rest,我們假設我們確實有文件夾。

無論如何,出於良好(安全)的目的, Git拒絕存儲任何名為.git的東西 因此, client/.git/*中的所有文件實際上都無法存儲:您不能將client中的子存儲庫放入 .git 中的超級項目中. ,即使./.git保存server/並且所有這些文件都很好。

相反,Git 將向超級項目添加 Git 稱為gitlink 的內容。 這是一個條目,上面寫着:克隆並簽出超級項目的提交后,也克隆另一個 Git 存儲庫。 在那個新的、額外的 Git 存儲庫中,我保存了您應該在該子項目中簽出的提交的原始 hash ID。

這就是您看到該說明的原因:

Subproject commit 327f06...88c

這就是使這個超級項目 Git 存儲庫成為超級項目的原因:它包含一個名為clientgitlink ,而 gitlink 本身——否則就像一個文件——說327f06...88c That 327f06...88c hash ID is the hash ID of a commit in the Git repository that Git should clone and place into a client folder within the superproject.

現在,這里的訣竅是讓 Git 運行:

git clone <url> client && (cd client && git checkout 327f06...88c)

Git 需要知道url才能在此命令行上使用。 gitlink 只記錄提交 hash ID 和路徑名client URL 進入一個單獨的文件,正如chickahoona 提到的,名為.gitmodules

問題是,當你跑的時候:

git add .

不會為您創建.gitmodules文件。 要創建該文件,您必須使用git submodule add而不是git add The git submodule add command takes the same kind of argument as git add —the name client in this case—but also takes a URL, which it will add to the .gitmodules file in the form that Git will need to run the git clone command之后。

不必在計算機上運行此git clone命令,因為您已經client/.git中有一個 Git 存儲庫。 所以git add. 只完成了一半的工作不會影響使用這個超級項目/gitlink 配對。 但這意味着沒有其他人可以使用您的超級項目,因為缺少克隆指令。

不清楚的是,您個人是否希望將服務器和客戶端存儲在兩個單獨的 Git 存儲庫中(一個超級項目和一個子模塊),或者您是否希望將其存儲在三個Git 存儲庫中:

  • 一個僅用於服務器,
  • 一個僅供客戶使用,並且
  • 一個綁定他們。 1

最后一個將是設置中唯一的超級項目,包含兩個 gitlink 和一個引用兩個子模塊的.gitmodules文件。 The server's files would be in a Git repository stored in server/.git and the client's files would be in a Git repository stored in client/.git (as they are now).

或者,也許您根本不想要任何子模塊。 在這種情況下,您需要刪除client/.git文件夾(或將其移至其他位置)。 這將破壞(或移動到其他地方)包含客戶端的整個存儲庫 但是,您將保留該存儲庫中的所有工作樹文件。 現在內部存儲庫已經消失,這些工作樹文件可以git add到超級項目的內容中。 這些文件將命名為client/main.js和 Git 將創建一個client/文件夾並將它們解壓縮到該client/文件夾中名為main.js的文件等。

只有你可以決定你想在這里做什么。 決定然后繼續:要么使用git submodule add正確添加子模塊,要么將服務器也變成一個子模塊並添加它,或者刪除(或移動)客戶端 Git存儲庫,但不是客戶端文件的當前版本


1天底下精靈王的三枚戒指,
矮人領主的七人在他們的石頭大廳里……

暫無
暫無

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

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