解决方法:错误:'<filename>'没有签出提交 致命:在命令提示符下输入"git add ."时添加文件失败



我正在尝试将一个 ruby rails 文件添加到我在 gitlab 中的存储库中,但它不知何故不允许我添加该文件,说我的文件没有签出提交。

我已经尝试了 git 拉取,再次制作文件并添加 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 存储库,然后在该存储库下的子目录中创建/克隆另一个存储库,则可能会发生这种情况。

为了扩展Mario Zigliotto和Albert的答案,发生这种情况的原因是因为子模块。 以下是重现问题的简单方法:

$ 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的答案)。

在此之前,您应该:

  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。 在其他人能够使用超级项目之前,我必须创建这个 GitHub 存储库,为其提供足够的(例如,公共)访问权限,并git push子模块提交该 GitHub 存储库。 然后,我可以将我的超级项目中的提交git push存储库应该位于的任何位置。 然后你(通用的"你")可以git clone超级项目,它现在有一个.gitmodules文件,其中包含你的 Git 能够运行git clone ssh://git@github.com/place/where/submodule/lives.git sub的说明。

子模块有一堆可用性问题,上述所有复杂性就是其中之一。 确保你知道你正在进入什么。

我有同样的错误消息。 我通过删除导致目录中错误的文件来修复它。

我希望这有帮助=)

您不需要像第一个答案所暗示的那样从目录中删除整个文件,我只需要删除.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

我遇到了同样的问题,这是我发现的原因。

在其中一个子文件夹下,我初始化了 git,所以我有两个 .git 文件夹,一个在父目录中,另一个在子文件夹中

为了解决这个问题,我删除了子文件夹中的git

cd project-directory/sub_folder_name

检查是否有 .git 文件夹

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

该文件夹有一个.git文件夹,由于文件夹.git,它会导致错误。因此,只需删除该文件夹,然后重试。它会起作用。

注意:这是一个隐藏文件夹,因此只需选择窗口中的隐藏项目 设置

我尝试了所有这些解决方案,但没有一个对我有用。 但以下内容完全解决了我的问题。

git rm -r --cached .

如果要添加其他存储库,可以使用上述解决方案

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

注意:我假设您有不同的问题,但我有相同的错误消息,这是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 .运行良好。

如果某个嵌套文件夹中已经有一个.git目录,在大多数情况下是 git 作为错误抛出的<filename>,则会出现此问题。

如果已经有.git目录,并且您再次在某个父目录中使用git init,则会出现一些奇怪的情况,.git尝试跟踪另一个目录.git目录。

要解决此问题,请移动到该目录,然后使用rm -rf .git。这将删除嵌套文件夹中的.git目录,然后您可以使用git add --all或任何其他命令。

注意:删除.git将删除该文件夹的所有本地跟踪信息,例如本地提交或分支。

如果您有后端和前端文件夹,请导航到这些文件夹并在两个目录上运行此命令

$ rm -rf .git

然后导航回主目录

尝试使用"git add "添加多个文件时,我遇到了相同的错误消息。我能够逐个添加所有这些文件,而不是同时添加所有文件。

要添加到 Mario 的(正确)答案并解决此类可能非常常见的问题(e.g.in 使用存储库顶部文件夹中的应用程序生成器搭建应用程序,它会生成自己的.git文件),您可以运行以下命令来清理并将文件正确签入到 git。

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

就我而言,我只是不允许在分支内推送,所以我不得不创建另一个分支并发出拉取请求

今天我也遇到了这个问题,设法用这个解决方案解决了它:

git rm -r --cached .

之后,您可以添加不同的Github存储库

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

希望这有帮助,祝您编码愉快!

只需导航到该 suddir 并执行 git add . 和 alos 运行 git commit 并执行推送。之后,导航回您的根目录并执行 git 添加 .再。解决了我的问题

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

rm -rf 172069/08_lab_routes_controllers_views_172069_172188-Copy/adventure_game/.git
git add 172069/08_lab_routes_controllers_views_172069_172188-Copy/adventure_game/

相关内容

最新更新