Git推送失败到Windows共享

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

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

创build本地回购

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

创build远程回购(正如你看到它的初始化没有问题)

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

然后我在本地仓库中添加一个新的远程控制器,检查它是否真正起作用,添加一个新的文件并将其提交给我的本地仓库

 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' 

如果我做同样的步骤,而是推到我的硬盘上的本地回购,它完美的作品。 我起初以为也许它与预备案有关,但是因为我能够创build裸仓库没有问题..我卡住了。

有任何想法吗?

谢谢。

编辑:

我在Novellnetworking下

UPDATE

 $ git version git version 1.8.3.msysgit.0 

而输出使用GIT_TRACE = 1和一个完整的UNCpath:

 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和一个非UNCpath,结果是一样的,我不发布它不使post更长。

使用映射的网络驱动器的IP地址,而不是其UNC路径或字母解决问题。

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

使用下一个Git 2.12(2017年第1季度),您应该可以使用路径(不必使用IP地址来引用服务器)

见Johannes Sixt( j6t ) 提交的7814fbe (2016年12月14日) 。 (由Junio C gitstergitster -在承诺4833b7e ,2016年12月19日)

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

normalize_path_copy()不准备保留//server/share/dir种类路径的双斜杠,而是将其视为普通的POSIX样式路径并将其转换为/server/share/dir

当运行' git push //server/share/dir master '时会出现这个错误,因为当通过link_alt_odb_entries()注册隔离对象数据库时, link_alt_odb_entries()以规范化的形式使用路径。 不用说,目录不能使用错误的规范化路径访问。

修复它通过跳过所有的根部分,而不仅仅是一个潜在的驱动器前缀。 offset_1st_component负责这一点,请参阅compat/mingw.c :: mingw_offset_1st_component()

你需要说明哪个版本的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导致打印附加的诊断信息,这可以帮助确定push命令的针脚失败部分。

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

UPDATE

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

有一个非常类似的问题有一个挂载的Novell网络驱动器回购。 对于我甚至git add . 报告同样的错误,作为你的。 安装新版本的Novell客户端完全解决了这个问题。 我希望这能帮助未来遇到这个问题的人。

顺便说一句,使用IP地址或驱动器的UNC路径没有帮助解决问题。

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