【问题标题】:When pushing branches and tags, get error: cannot spawn git: no such file or directory推送分支和标签时,出现错误:无法生成 git:没有这样的文件或目录
【发布时间】:2013-02-14 03:18:00
【问题描述】:

我有一个现有的、裸露的 Git 存储库,它是通过从 CVS 导入我们的源代码和历史记录而创建的。我做了一面镜子,使用:

git clone --mirror git://aserver.adomain.com/myrepo

然后,我想将所有分支和标签推送到我们内部的 Git 存储库主机,但推送似乎没有将裸存储库视为 Git 存储库

我尝试了以下方法:

git clone --mirror git://aserver.adomain.com/myrepo
git remote set-url origin http://user@anotherserver.adomain.com/project/myrepo.git
git push origin

导致:

$ git push origin
Password for 'xxxx':
error: cannot spawn git: No such file or directory

或者我试试:

$ git remote rm origin
Note: Some branches outside the refs/remotes/ hierarchy were not removed;
to delete them, use:
  ...a whole lot of branches...

user@SOMEMACHINE /some/path/myrepo.git (BARE:master)
$ ls
HEAD  config  description  hooks  info  objects  packed-refs  refs

user@SOMEMACHINE /some/path/myrepo.git (BARE:master)
$ git branch -a
  ...a whole lot of local branches...

user@SOMEMACHINE /some/path/myrepo.git (BARE:master)
$ git remote add mygithost http://user@anotherserver.adomain.com/project/myrepo.git

user@SOMEMACHINE /some/path/myrepo.git (BARE:master)
$ git push --all mygithost
Password for 'xxxx':
error: cannot spawn git: No such file or directory

“无法生成 git”是什么意思?

如何将包含所有分支的裸仓库推送到现有的空仓库?

我搜索了几种可能性并查看了几个 SO 问题,但我没有看到解决此问题的方法。显然,我对这个过程的理解是有缺陷的。

更新

我想我的理解没有缺陷。该错误以某种方式误导我认为裸存储库有问题,因为我可以从“常规”克隆中克隆并逐个分支推送。

事实证明,这是 MSysGit 中的一个错误。我搬到 Linux 是因为保留所有历史记录是我的要求。我不能简单地删除分支和标签,因为它们需要被推送到空的远程仓库。因此,以下确实有效:

$ git remote rm origin
$ git clone --mirror git://aserver.adomain.com/myrepo
$ cd /some/path/myrepo.git
$ git remote add mygithost http://user@anotherserver.adomain.com/project/myrepo.git
$ git push --all mygithost
$ git push --tags mygithost

【问题讨论】:

  • 你在使用 MSysGit 吗?众所周知,如果您有大量标签,就会发生这种情况。见groups.google.com/forum/#!msg/msysgit/6bFAPUQDQLI/USrCnnZ4x5QJ
  • 是的,我是。这可能会有所帮助。我会在 Linux 上试试这个。
  • 就是这样。在linux上工作得很好。请将此作为答案发布,以便我接受。

标签: git msysgit git-bare


【解决方案1】:

由于此评论导致了解决方案(请参阅问题末尾的编辑),因此将其重新发布为答案:

你在使用 MSysGit 吗?众所周知,如果您有大量标签,就会发生这种情况。见This post

【讨论】:

  • 奇怪的是,我相信我在尝试使用 http 克隆时遇到了另一个“大量标签”问题。克隆在 git 协议下运行良好,但从 http 得到:error: could not spawn git: no such file or directory。我正在使用 1.7.8 并移至 1.8.1 解决了这个问题。我在 MSysGit 错误跟踪器中找不到问题,但也许“标签问题”已解决?
  • 谢谢!我遇到了同样的错误(“错误:无法生成 git:没有这样的文件或目录”),甚至升级到最新的 msysgit(1.9.2)也没有修复它,但运行相同的命令,git push kiln --tags,从我的 Linux 虚拟机就可以了。
【解决方案2】:

根据this post,根本问题是如果安装到路径中有空格的目录中,git 会出现异常行为。这与我遇到错误的环境和报告的错误消息一致。

鉴于 git 最初是由 Linux 的作者编写的,我想这种行为并不令人意外。典型的解决方法似乎是使用对路径名中的空格不友好的操作系统。

【讨论】:

  • 不!不仅。我重新安装了 git,问题仍然存在。标签数量可能。
【解决方案3】:

我也有这个问题,因为在Windows上使用git时有大量的标签。我通过制作一个批处理脚本来解决它,该脚本一次推送一个标签,直到标签数量略低于 500。然后我能够制作一个需要一些时间才能完成的git push,但工作正常。

所以您几乎只需打开记事本,为您要推送的每个标签写git push origin <yourtagname>,每行一个,将其保存为 blabla.bat 在您的 git 存储库文件夹中并运行它。如果你只是从标签文件夹.git\refs\tags 复制所有文件名,然后做一些替换魔法,在每个文件名前面添加git push origin,那就更容易了。

【讨论】:

    【解决方案4】:

    当我尝试在 stash/bitbucket git 服务器上推送一些从 TFS 导出的大型项目(在本地 pc git 文件夹上)时,我遇到了同样的问题(无法生成 git:没有这样的文件或目录)。有一个分支和很多标签(3K+ 标签)。推送所有标签命令时出现问题,而推送单个标签可以正常工作。我正在使用 GitExtensions(基于 msysgit)并且与远程的连接是 http。

    解决方案突然解决了:我重新配置了我的 git 以 使用 SSH 连接到远程而不是 http,这奇迹般地解决了问题:推送所有标签都成功了.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-15
      • 2017-02-23
      • 2019-12-13
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-05-31
      • 1970-01-01
      相关资源
      最近更新 更多