簡體   English   中英

如何修復:錯誤:'<filename> ' 沒有檢查出致命的提交:輸入“git add”時添加文件失敗。 在命令提示符下</filename>

[英]How to fix: error: '<filename>' does not have a commit checked out fatal: adding files failed when inputting "git add ." in command prompt

我正在嘗試將一個 ruby rails 文件添加到我在 gitlab 中的存儲庫中,但它以某種方式不允許我添加文件,說我的文件沒有提交檢出。

我試過 git pull,再次制作文件並添加 git 但仍然無法正常工作

error: '172069/08_lab_routes_controllers_views_172069_172188-Copy/adventure_game/' does not have a commit checked out
fatal: adding files failed

如果您有一個帶有.git目錄的子目錄並嘗試git add . 你會看到這條消息。

如果您有一個 git 存儲庫,然后在該存儲庫下的子目錄中創建/克隆另一個存儲庫,就會發生這種情況。

我有同樣的錯誤消息。 我通過從我的目錄中刪除導致錯誤的文件來修復它。

我希望這會有所幫助 =)

你不需要像第一個答案所暗示的那樣從目錄中刪除整個文件,我只需要刪除.git目錄,然后你的git add . 將工作

發生這種情況的原因是@Mario Zigliotto 建議的,該存儲庫下的子目錄中有另一個存儲庫。

我有同樣的錯誤信息。 我通過以下命令修復了它:

git add folder-name/*而不是git add .

我的文件夾目錄如下:

Main-folder
 -folder-one
 -folder-two

參考: https : //github.community/t/error-git-add/2937

為了擴展Mario ZigliottoAlbert's answer的已接受答案,發生這種情況的原因是submodules 這是重新創建問題的簡單方法:

$ mkdir empty-submodule && cd empty-submodule
$ git init
Initialized empty Git repository in [path ending in empty-submodule/.git]
$ mkdir sub && (cd sub && git init)
Initialized empty Git repository in ... [path ending in empty-submodule/sub/.git]
$ ls
sub
$ ls -a sub
.       ..      .git
$ git add .
error: 'sub/' does not have a commit checked out
fatal: adding files failed

請注意,子目錄sub本身就是一個 Git 存儲庫,但在此子目錄中未檢出任何提交 這是一個簡單的事實陳述,在這種情況下是正確的,因為我創建了sub ,進入了它,並在那里創建了一個新的空 Git 存儲庫。 這樣Git倉庫已經完全沒有提交。

對於上述事實,我們再添加一個:任何 Git 存儲庫都不能在其中容納另一個 Git 存儲庫。 這樣做的原因與安全有關,但就我們的目的而言,這一事實的重要副作用是嘗試將子存儲庫添加到存儲庫(如empty-submodule的超級項目)不會添加存儲庫本身。 相反,它添加了對存儲庫中提交引用 這就是子模塊的實現方式。 1但要參考一些子模塊提交,該子模塊本身已經具備一定的承諾簽出

解決此問題的方法實際上取決於您想要的結果。 有關這方面的更多信息,請參閱下一節。


1從技術上講,子模塊由兩部分實現:

  • 超級項目(“外部”存儲庫)中的每個提交都有對子模塊內提交的引用。
  • 為了能夠在子模塊運行git clone ,外部存儲庫還應該包含一個.gitmodules文件。 這個文件將包含告訴超級項目 Git 如何git clone子模塊的指令。 一旦子模塊存儲庫存在,超級項目 Git 就不再需要在其上運行git clone 因此,可能會意外或故意完全省略.gitmodules文件。

這樣做會產生一個難以使用的超級項目。 我喜歡稱其為半途而廢的子模塊 如果它是完整的,超級項目將能夠克隆子模塊,但由於.gitmodules文件丟失,它不能。


解決問題

有多種方法可以解決問題。 在你選擇一個之前,你應該知道你是否想要一個子模塊。 這里沒有一個正確的答案,因為我應該使用子模塊的問題有點像我應該選擇哪種口味的冰淇淋:不同的人有不同的偏好。

如果您根本不需要子模塊,則需要移動或刪除相關子目錄中的.git子目錄,例如:

rm -rf sub/.git

(如果在 Windows 上使用 PowerShell,另見Nissan 的回答)。

在你這樣做之前,你應該:

  1. 確定是否要保留其他存儲庫 如果是這樣,請不要刪除它! 只需將它移動到其他地方,例如, mkdir ../keep && mv sub/.git ../keep

  2. 在移動或刪除存儲庫.git目錄)之前,確定您是否需要git checkout某些提交或分支。 如果是這樣,請進入子模塊並檢查所需的提交。

如果你確實想要一個子模塊,你可能需要在子模塊中進行一些提交,或者檢查一些現有的提交,就像上面的第 2 步一樣。 一旦子模塊存儲庫正確提交,您就可以git add它。

這是在名為sub模塊中創建提交的示例:

$ cd sub
$ echo this is the submodule > README.md
$ git add .
$ git commit -m initial
[master (root-commit) c834131] initial
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ cd ..

現在子模塊有一個提交,我可以將它添加到超級項目中。 不過這里有一些問題,因為我應該創建上面腳注 1 中提到的.gitmodule文件。 git submodule add命令為您完成所有工作,但您需要知道將git push這個子模塊存儲庫的位置。 例如:

$ git submodule add ssh://git@github.com/place/where/submodule/lives.git sub
Adding existing repo at 'sub' to the index

現在一切准備就緒,可以在超級項目中提交:

$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   .gitmodules
        new file:   sub

$ cat .gitmodules
[submodule "sub"]
        path = sub
        url = ssh://git@github.com/place/where/submodule/lives.git

子模塊實際上還沒有發送到 GitHub。 在其他人能夠使用superproject 之前,我必須創建這個 GitHub 存儲庫,為其提供足夠的(例如,公共)訪問權限,並將子模塊提交git push該 GitHub 存儲庫。 然后,我可以git push我在我的上層項目承諾的任何位置存儲庫應該住在。 然后你——一般的“你”——可以git clone superproject ,它現在有一個.gitmodules文件,其中包含你的 Git 將能夠運行git clone ssh://git@github.com/place/where/submodule/lives.git sub

子模塊有一堆可用性問題,上述所有復雜情況都是其中之一。 確保你知道你在做什么。

注意:我假設您遇到了不同的問題,但我有相同的錯誤消息,這是第一個 Google 結果,因此發布我的情況、問題和解決方案可能對其他人有所幫助。

我有一個帶有 Git 子模塊的倉庫。

錯誤由git commit .發生git commit .

error: 'xyz' does not have a commit checked out
fatal: updating files failed

然后我做了git submodule init ,它打印了:

Submodule 'xyz' (git@github.com:albertz/...) registered for path 'xyz'
...

然后git submodule update

Cloning into '.../xyz'...
...
Submodule path 'xyz': checked out '...'
...

這修復了錯誤。 現在git commit . 運行良好。

我有同樣的問題,這就是我發現的原因。

在其中一個子文件夾下我初始化了 git 所以我有兩個.git 文件夾,一個在父目錄中,另一個在子文件夾中

為了解決這個問題,我刪除了子文件夾中的 git

cd project-directory/sub_folder_name

檢查是否有.git文件夾

ls -la

rm -rf .git 
cd ..
git add .
git commit -m "commit message"

嘗試使用“git add”添加多個文件時,我遇到了相同的錯誤消息。 我能夠一個一個地添加所有這些文件,而不是同時添加所有文件。

要添加到Mario 的(正確)答案並解決此類非常常見的問題(例如,在存儲庫頂部文件夾中使用應用程序生成器搭建應用程序的腳手架,並生成自己的.git文件),您可以運行以下命令清理並將文件正確簽入到 git。

cd {{appname}}
rm -rf .git 
# rm -r -fo .git # if on Windows powershell
cd ..    
git add .  

我的解決方案最終使用:

git mergetool

這帶來了一個界面,我可以在其中標記子模塊應該在本地還是遠程使用。

Submodule merge conflict for 'abc':
  {local}: submodule commit (hash)
  {remote}: submodule commit (hash)
Use (l)ocal or (r)emote, or (a)bort?

我嘗試了所有這些解決方案,但沒有一個對我有用。 但以下完全解決了我的問題。

git rm -r --cached .

如果要添加不同的 repo,可以使用上述解決方案

git remote set-url origin git@gitlab.com:username/project.git

如果某些嵌套文件夾中已經有一個.git目錄,在大多數情況下是 git 作為錯誤拋出的 < filename >,則會出現此問題。

如果已經存在.git目錄並且您再次在某個父目錄中使用git init ,那么會出現一些奇怪的情況,即.git嘗試跟蹤另一個.git目錄。

要解決此問題,請移至該目錄,然后使用rm -rf .git 這將刪除嵌套文件夾中的.git目錄,然后您可以使用git add --all或任何其他命令。

注意:刪除.git將刪除該文件夾的所有本地跟蹤信息,例如本地提交或分支。

在我的情況下,我只是不允許在分支內推送,所以我不得不創建另一個並發出拉取請求

該文件夾有一個.git文件夾,由於.git文件夾📁,它會導致錯誤。 所以只需刪除該文件夾,然后再試一次。 它將起作用。

注意:這是一個隱藏文件夾,所以只需在windows設置中選擇隱藏項目

如果您同時擁有后端和前端文件夾,請導航到這些文件夾並在兩個目錄上運行此命令

$ rm -rf .git

然后導航回您的主目錄

今天我也陷入了這個問題,設法用這個解決方案解決了這個問題:

git rm -r --cached .

之后,您可以添加不同的 Github 回購

git remote set-url origin git@gitlab.com:.../thisIsYourProject.git

希望這會有所幫助,快樂的編碼!

只需導航到那個 suddir 並執行 git add。 並且還運行 git commit 並進行推送。 之后導航回您的根目錄並執行 git add。 again.That 解決了我的問題

使用git add folderName/而不是git add folderName

我正在嘗試將ruby rails文件添加到我在gitlab中的存儲庫中,但是以某種方式不允許我添加該文件,說我的文件沒有提交簽出。

我試過git pull,再次制作文件並git添加,但仍然無法正常工作

error: '172069/08_lab_routes_controllers_views_172069_172188-Copy/adventure_game/' does not have a commit checked out
fatal: adding files failed

暫無
暫無

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

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