繁体   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