6

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

4 回答 4

8

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

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

于 2013-02-20T22:28:00.657 回答
1

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

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

于 2015-02-05T18:51:26.823 回答
1

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

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

于 2015-10-15T13:25:03.620 回答
1

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

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

于 2016-01-27T09:42:59.353 回答