我正在尝试从我的本地存储库推送到位于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路径,结果是一样的,我不发布它不会让帖子更长。
答案 0 :(得分:2)
使用映射网络驱动器的IP地址代替其UNC路径或字母解决了问题。
git remote set-url origin //ip-address/share/central.git
答案 1 :(得分:1)
使用下一个Git 2.12(2017年第一季度),您应该能够使用路径(无需使用IP地址来引用服务器)
commit 7814fbe见Johannes 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