当推送分支和标签时,得到错误:无法生成git:没有这样的文件或目录

时间:2013-02-14 03:18:00

标签: git msysgit git-bare

我有一个现有的裸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

&#34的含义是什么;不能产生git"?

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

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

更新

我想我的理解并没有缺陷。错误以某种方式误导我认为裸存储库出现了问题,因为我可以克隆并按分支推送分支,从#34;常规"克隆。

事实证明,这是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

4 个答案:

答案 0 :(得分:7)

由于此评论导致了一个解决方案(请参阅问题末尾的编辑),此处将其转贴为答案:

您使用的是MSysGit吗?众所周知,如果您有大量标签,就会发生这种情况。请参阅This post

答案 1 :(得分:1)

根据this post,潜在的问题是,如果安装到路径中包含空格的目录,则git行为不正常。这与我遇到错误并报告错误消息的环境一致。

我认为这种行为并不令人惊讶,因为git最初是由Linux的作者编写的。典型的解决方法似乎是使用对路径名中的空格不利的操作系统。

答案 2 :(得分:1)

在Windows上使用git时,由于大量标签,我也遇到此问题。我通过制作一个批处理脚本来解决它,一次一个地推送一些标签,直到标签数量略低于500.然后我能够制作一个git push需要一些时间来完成,但是工作了

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

答案 3 :(得分:1)

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

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