Git推送失败到Windows共享

时间:2014-01-08 10:14:29

标签: windows git

我正在尝试从我的本地存储库推送到位于Windows共享中的远程存储库。

我将重新创建一个简单的场景,其中c是我的本地硬盘,n是映射的网络驱动器,并向您显示我得到的错误。

创建本地仓库

user@PC-W7 /c/More_git
$ git init
Initialized empty Git repository in c:/More_git/.git/

创建远程仓库(因为您看到它已初始化而没有问题)

user@PC-W7 /n/git/central.git
$ git --bare init
Initialized empty Git repository in n:/git/central.git/

然后我在我的本地仓库中添加一个新的遥控器,检查它是否真的有用,添加一个新文件并将其提交给我当地的repositoy

user@PC-W7 /c/More_git (master)
$ git remote add origin /n/git/central.git

user@PC-W7 /c/More_git (master)
$ git remote -v
origin  n:/git/central.git (fetch)
origin  n:/git/central.git (push)

user@PC-W7 /c/More_git (master)
$ git add a.txt

user@PC-W7 /c/More_git (master)
$ git commit -a -m "a.txt added"
[master (root-commit) c075576] a.txt added
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt

此时我已准备好推动,问题就出现了

user@PC-W7 /c/More_git (master)
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: unable to create temporary file: File exists
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To n:/git/central.git
 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to 'n:/git/central.git'

如果我执行相同的步骤,而是将其推送到硬盘中的本地存储,它可以完美运行。我一开始以为可能它与预先设置有关,但是因为我能够毫无问题地创建裸存储库..我被卡住了。

有什么想法吗?

谢谢。

编辑:

我在Novell网络下

更新

$ git version
git version 1.8.3.msysgit.0

输出使用GIT_TRACE = 1和完整的UNC路径:

user@PC-W7 /c/More_git (master)
$ git remote set-url origin //vshare/DATA/PUBUSER/git/central.git

user@PC-W7 /c/More_git (master)
$ git remote -v
origin  //vshare/DATA/PUBUSER/git/central.git (fetch)
origin  //vshare/DATA/PUBUSER/git/central.git (push)

user@PC-W7 /c/More_git (master)
$ GIT_TRACE=1 git push origin master
trace: built-in: git 'push' 'origin' 'master'
trace: run_command: 'git-receive-pack '\''//vshare/DATA/PUBUSER/git/central.git'\'''
trace: built-in: git 'receive-pack' '//vshare/DATA/PUBUSER/git/central.git'
trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
Counting objects: 3, done.
trace: run_command: 'unpack-objects' '--pack_header=2,3'
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: trace: built-in: git 'unpack-objects' '--pack_header=2,3'
remote: error: unable to create temporary file: File exists
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
trace: run_command: 'gc' '--auto' '--quiet'
trace: built-in: git 'gc' '--auto' '--quiet'
To //vshare/DATA/PUBUSER/git/central.git
 ! [remote rejected] master -> master (unpacker error)
error: failed to push some refs to '//vshare/DATA/PUBUSER/git/central.git'

我也试过GIT_TRACE和非UNC路径,结果是一样的,我不发布它不会让帖子更长。

4 个答案:

答案 0 :(得分:2)

使用映射网络驱动器的IP地址代替其UNC路径或字母解决了问题。

git remote set-url origin //ip-address/share/central.git

答案 1 :(得分:1)

使用下一个Git 2.12(2017年第一季度),您应该能够使用路径(无需使用IP地址来引用服务器)

commit 7814fbeJohannes Sixt (j6t)(2016年12月14日)。 Junio C Hamano -- gitster --合并于commit 4833b7e,2016年12月19日)

  

normalize_path_copy():修复推送到Windows上的//server/share/dir

     

normalize_path_copy()不准备保持a的双斜线   //server/share/dir种路径,但将其视为常规POSIX   样式路径并将其转换为/server/share/dir

     

git push //server/share/dir master' tmp_objdir_add_as_alternate()'运行,   因为link_alt_odb_entries()使用规范化的路径   通过注册隔离对象数据库时的表单   offset_1st_component。毋庸置疑,目录不可能   使用错误的规范化路径访问。

     

通过跳过所有根部分来修复它,而不仅仅是潜在的驱动器   字首。 void showPopup(); 处理此问题,请参阅   在compat/mingw.c::mingw_offset_1st_component()中实施。

答案 2 :(得分:0)

您需要说明哪个版本的git(使用git version命令)。当我用Git for Windows 1.8.3(以及1.8.4和1.8.5)尝试这个时,它运行正常:

$ git remote add origin /z/ztest.git

$ git remote -v
origin  z:/ztest.git (fetch)
origin  z:/ztest.git (push)

$ GIT_TRACE=1 git push origin master
trace: built-in: git 'push' 'origin' 'master'
trace: run_command: 'git-receive-pack '\''z:/ztest.git'\'''
trace: built-in: git 'receive-pack' 'z:/ztest.git'
trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
Counting objects: 3, done.
trace: run_command: 'unpack-objects' '--pack_header=2,3'
Writing objects: 100% (3/3), 212 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: trace: built-in: git 'unpack-objects' '--pack_header=2,3'
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all'
trace: run_command: 'gc' '--auto' '--quiet'
trace: built-in: git 'gc' '--auto' '--quiet'
To z:/ztest.git
 * [new branch]      master -> master

如您所见,在命令之前添加GIT_TRACE=1会导致打印其他诊断信息,这有助于确定推送命令的失败部分。

一般情况下,我倾向于使用完整的UNC路径而不是分配的驱动器号(例如:git remote add origin //MACHINE/Share/path/dir.git但如果路径非常长,您可能会被迫使用驱动器号。

更新

检查git源报告的错误显示这必须来自sha1_file.c,因为该文件中的create_tmpfile调用失败。在此函数中,尝试创建一个名为tmp_obj_XXXXXX的临时文件(其中X被替换为git_mkstemps_mode()中唯一的东西)。如果是权限问题,您将收到不同的消息,因此由于某种原因,它无法在远程驱动器上创建这些临时文件(错误位于存储库为远程存储库的解包部分)。它最多尝试16384次以查找唯一名称,因此问题可能出现在正在使用的目录路径中。我想你需要编译Git for Windows并在git / wrapper.c中的git_mkstemps_mode函数中找到一个断点来找出发生了什么。如果您按照the installation instructions获取msysGit,那么这将为您构建它,您可以尝试调试。

答案 3 :(得分:0)

在安装的Novell网络驱动器上有一个非常类似的问题。对我来说,即使git add .也报告了与您相同的错误。安装新版本的Novell客户端完全解决了这个问题。我希望这可以帮助将来遇到这个问题的人。

顺便说一下,使用ip-adress或驱动器的UNC路径无助于解决问题。

P.S。 这显然只是某个版本的Novell上的Novell-Windows-NTFS-MinGW问题。 如果您有兴趣,请参阅以下详细信息: http://git.661346.n2.nabble.com/Problem-pushing-to-a-Novell-share-td7248875.html