msys推送分支和标记时,get-error:无法生成git:没有这样的文件或目录



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

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

然后,我想将所有分支和标签推送到我们的内部Git repo主机

,但推送似乎没有将裸存储库视为Git repo

我尝试过以下几种:

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吗?如果你有大量的标签,就会发生这种情况。请参阅这篇文章。

根据这篇文章,潜在的问题是,如果git安装到路径中有空格的目录中,则会出现错误行为。这与我遇到错误的环境以及报告的错误消息一致。

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

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

因此,你几乎只需打开记事本,为你想要推送的每个标签写git push origin <yourtagname>,每行一个,将其保存为git存储库文件夹中的blabla.bat并运行它。如果你只是从标签文件夹.gitrefstags中复制所有文件名,并做一些替换魔术,在每个文件名前面添加git push origin,这会更容易。

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

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

最新更新