如何修复:错误:'<filename>' 没有提交检查致命:输入“git add”时添加文件失败。在命令提示符下
Posted
技术标签:
【中文标题】如何修复:错误:\'<filename>\' 没有提交检查致命:输入“git add”时添加文件失败。在命令提示符下【英文标题】:How to fix: error: '<filename>' does not have a commit checked out fatal: adding files failed when inputting "git add ." in command prompt如何修复:错误:'<filename>' 没有提交检查致命:输入“git add”时添加文件失败。在命令提示符下 【发布时间】:2019-11-14 07:55:26 【问题描述】:我正在尝试将一个 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
【问题讨论】:
欢迎来到 Stack Overflow!如果您更新问题的标题以使您的问题更清楚,您可能会获得更多帮助。尝试将错误消息“放在引号中”。 【参考方案1】:我有同样的错误信息。 我通过从我的目录中删除导致错误的文件来修复它。
我希望这会有所帮助 =)
【讨论】:
【参考方案2】:尝试使用“git add”添加多个文件时,我收到了相同的错误消息。我能够一个一个地添加所有这些文件,而不是同时添加所有这些文件。
【讨论】:
【参考方案3】:如果您有一个带有.git
目录的子目录并尝试git add .
,您将看到此消息。
如果您有一个 git 存储库,然后在该存储库下的子目录中创建/克隆另一个存储库,则可能会发生这种情况。
【讨论】:
就我而言,我不小心在存储库中创建了一个目录名称.,
。删除它解决了这个问题。
我有类似的问题,但解决方法是寻找现有的 git repo 包含作为子文件夹并删除。之后,run the git add .
【参考方案4】:
您不需要像第一个答案建议的那样从目录中删除整个文件,我只需要删除.git
目录,然后您的git add .
就可以工作了
发生这种情况的原因是 @Mario Zigliotto 建议的,在该 repo 下的子目录中还有另一个 repo。
【讨论】:
你不想对子模块这样做。【参考方案5】:我有同样的错误信息。我通过以下命令修复了它:
git add folder-name/*
而不是 git add .
我的文件夹目录如下:
Main-folder
-folder-one
-folder-two
参考:https://github.community/t/error-git-add/2937
【讨论】:
【参考方案6】:要添加到Mario's (correct) answer 并解决此类非常常见的问题(例如,使用存储库顶部文件夹中的应用生成器构建应用程序,并生成自己的.git
文件),您可以运行以下命令用于清理并将文件正确签入到 git。
cd appname
rm -rf .git
# rm -r -fo .git # if on Windows powershell
cd ..
git add .
【讨论】:
【参考方案7】:注意:我假设您遇到了不同的问题,但我收到了相同的错误消息,这是 Google 的第一个结果,因此发布我的情况、问题和解决方案可能对其他人有所帮助。
我有一个带有 Git 子模块的仓库。
错误发生在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 .
运行良好。
【讨论】:
这对我不起作用,因为子模块更新说Skipping unmerged submodule
并且签出和其他所有手动都不起作用,因为 error: you need to resolve your current index first
。
@DustWolf 在我的例子中,子模块没有被检出。他们的目录只是空的。我猜您有一些不同的情况,其中某些子模块处于不良状态。也许只是子模块上的git reset
。如果您不知道如何解决此问题,我会发布一个单独的问题。
我的子模块目录也是空的。合并之前的子模块初始化/更新修复它,谢谢。【参考方案8】:
我的解决方案最终使用:
git mergetool
这带来了一个界面,我可以在其中标记应在本地还是远程使用子模块。
Submodule merge conflict for 'abc':
local: submodule commit (hash)
remote: submodule commit (hash)
Use (l)ocal or (r)emote, or (a)bort?
【讨论】:
【参考方案9】:要扩展the accepted answer from Mario Zigliotto 和Albert's answer,发生这种情况的原因是子模块。这是重现问题的简单方法:
$ 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's answer)。
在您这样做之前,您应该:
确定是否要保留其他存储库。如果是这样,不要删除它!只需将其移至其他位置,例如mkdir ../keep && mv sub/.git ../keep
。
在移动或删除 存储库(.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
将子模块提交 to 那个 GitHub 存储库。然后我可以git push
我在我的超级项目中的提交到任何位置 那个 存储库应该存在。然后你——一般的“你”——可以git clone
superproject,它现在有一个 .gitmodules
文件,其中包含您的 Git 将能够运行 git clone ssh://git@github.com/place/where/submodule/lives.git sub
的说明。
子模块有很多可用性问题,上述所有问题都是其中之一。确保你知道你要做什么。
【讨论】:
【参考方案10】:我尝试了所有这些解决方案,但没有一个对我有用。但以下完全解决了我的问题。
git rm -r --cached .
如果您想添加不同的 repo,可以使用上述解决方案
git remote set-url origin git@gitlab.com:username/project.git
【讨论】:
【参考方案11】:使用git add folderName/
而不是git add folderName
【讨论】:
【参考方案12】:如果在某些嵌套文件夹中已经有一个.git
目录,在大多数情况下是 git 抛出的错误 filename>,则会出现此问题。
如果已经有.git
目录,并且您在某个父目录中再次使用git init
,那么会出现.git
尝试跟踪另一个目录的奇怪情况
.git
目录。
要解决此问题,请移至该目录,然后使用 rm -rf .git
。这将删除嵌套文件夹中的.git
目录,然后您可以使用git add --all
或任何其他命令。
注意:删除 .git
将清除该文件夹的所有本地跟踪信息,例如本地提交或分支。
【讨论】:
【参考方案13】:在我的情况下,我只是不被允许在分支内推送,所以我必须创建另一个并发出拉取请求
【讨论】:
【参考方案14】:该文件夹有一个.git
文件夹,由于.git
文件夹?,它会导致错误。因此,只需删除该文件夹,然后再试一次。它会工作的。
注意:这是一个隐藏文件夹,所以在windows中选择隐藏项目即可 设置
【讨论】:
【参考方案15】:如果您同时拥有后端和前端文件夹,请导航到这些文件夹并在两个目录上运行此命令
$ rm -rf .git
然后导航回您的主目录
【讨论】:
以上是关于如何修复:错误:'<filename>' 没有提交检查致命:输入“git add”时添加文件失败。在命令提示符下的主要内容,如果未能解决你的问题,请参考以下文章
如何修复错误:断言错误:应该在更新模式下运行 [预期 => 假 == 真 <= 实际]