2014-01-07 88 views
4

挂起当我运行git拉,我得到这个:的Git拉在SMB共享资源库

edson$ GIT_TRACE=1 git pull -v 
trace: exec: 'git-pull' '-v' 
trace: run_command: 'git-pull' '-v' 
trace: built-in: git 'rev-parse' '--git-dir' 
trace: built-in: git 'rev-parse' '--is-bare-repository' 
trace: built-in: git 'rev-parse' '--show-toplevel' 
trace: built-in: git 'ls-files' '-u' 
trace: built-in: git 'symbolic-ref' '-q' 'HEAD' 
trace: built-in: git 'config' 'branch.master.rebase' 
trace: built-in: git 'config' 'pull.rebase' 
trace: built-in: git 'rev-parse' '-q' '--verify' 'HEAD' 
trace: built-in: git 'fetch' '-v' '--update-head-ok' 
trace: run_command: 'ssh' '[email protected]' 'git-upload-pack '\''xxxltd/xxxltd.git'\''' 
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' '--quiet' 
trace: run_command: 'rev-list' '--objects' '--stdin' '--not' '--all' 
trace: exec: 'git' 'rev-list' '--objects' '--stdin' '--not' '--all' 
trace: built-in: git 'rev-list' '--objects' '--stdin' '--not' '--all' 
From bitbucket.org:xxxltd/xxx 
= [up to date]  master  -> origin/master 
= [up to date]  blah -> origin/blah 
trace: run_command: 'gc' '--auto' 
trace: exec: 'git' 'gc' '--auto' 
trace: built-in: git 'gc' '--auto' 
trace: built-in: git 'rev-parse' '-q' '--verify' 'HEAD' 
trace: built-in: git 'fmt-merge-msg' 

但后来它只是挂在那儿。 (bitbucket)存储库位于Windows 7 vmware机器内部。然后该存储库通过SMB与主机(mac osx)共享。我在主机上运行git pull(macports)。

如果我在vm中运行git pull(msysgit),它工作正常。

任何线索?

+1

我看到完全一样的东西。直到我升级到小牛之前,它一直没有发生。我认为这可能是SMB的权限问题,但似乎无法弄清楚。 – Abe

+0

现在你已经提到了,自从我升级到小牛后,它的确发生得更频繁。另外,当我在vm中运行git pull时,有时库会变得不能用于主机(直到我删除.git/index并执行git reset) –

回答

3

在Git源代码中,似乎存在一个无限循环Git's fmt-merge-msg function,当回购站位于SMB共享中,同时从小牛队访问时。我能够解决这个问题的唯一方法是通过做一个不涉及自动合并的过程。

git pull本质上是一个git fetch && git merge所有在一个命令。如果您尝试在当前分支进行更改时执行git fetch,则可能会遇到git fetch失败的问题。

我已经解决了这个问题的方法是将远程分支获取到临时本地分支中,并将它们合并到您的工作分支中。请参阅以下哪些详细信息试图从您的origin/master获取最新更改到您当前的工作分支master

  1. 取从origin master的最新变化到名为master_merge_tmp一个地方分支。 git fetch [<remote loc>] [<remote branch>]:[<local branch>]让您无需自动调用fmt_merge_msg获取最新的变化,你可以针对不同的本地分支目标:

    git fetch origin master:master_merge_tmp 
    
  2. 合并的master_merge_tmp分支到master

    git merge master_merge_tmp 
    
  3. 删除进行一些清理工作远程分支mater_merge_tmp

    git branch -D master_merge_tmp 
    

或者,您可以创建一个辅助函数来自动完成上述步骤。您可以在.bashrc.zshrc放置此:

# Workaround for fmt-merge-msg issue on Mavericks w/SMB repo 
# gfm [<remote>] [<remote branch>] 
function _git-fetch-merge() { 
    local remote="$1" 
    local branch="$2" 
    local tmp_branch="${2}_merge_tmp" 
    git fetch $remote $branch:$tmp_branch 
    git merge $tmp_branch 
    git branch -D $tmp_branch 
} 
alias gfm="_git-fetch-merge" 

现在从终端,你可以做到以下几点:

_git-fetch-merge origin master 

或者您可以使用别名:

gfm origin master 

如果您正在与远程上游分支机构合作:

gfm upstream master 
+1

精彩的回答!我无法在网上找到任何线索。非常感谢! –

+1

欢迎您!这是一个艰难的打败,迫使SMB1超过SMB2仍然没有解决这个问题。如果能得到一些时间,我将不得不向Git提交关于此问题的错误报告。 – psyrendust

0

小牛已经知道Samba协议的问题。尝试将回购安装为cifs://vm.ip而不是smb://vm.ip(source)

+0

我得到“连接服务器时出现问题”xxxxx“ –

2

苹果用小牛切换到了SMB2,并且它对于很多人来说效果不佳。作为替代,这里有一个更加永久性的修复,则可以改为申请的cifs://临时之一:

要强制所有的连接都必须SMB1:

打开一个终端窗口 贴在下面的行之后返回键(应该是全部在一行上):

echo "[default]" >> ~/Library/Preferences/nsmb.conf; echo "smb_neg=smb1_only" >> ~/Library/Preferences/nsmb.conf 

命令的作用:

在主目录中创建一个名为nsmb.conf的文件,路径为〜/ Library/Preferences/nsmb.conf。 添加指令以强制SMB连接使用SMB1协议。这是较慢但稳定。

如何清除变通方法:

打开一个终端窗口 糊在提示符以下,然后按回车键:

rm ~/Library/Preferences/nsmb.conf 

注:source

它是一个好主意,尝试之前重新启动您的mac再次连接到您的 存储。这将清除之前 的所有挂起的SMB进程在执行此 解决方法之前尝试连接到您的存储。


编辑:OP回答说:“这是没有帮助” - 不是的话是最好的选择,但你的想法。

+1

I'我试过这个,但是没有什么帮助。 – psyrendust

+1

@psyrendust,如果你有任何其他的日志或者其他信息,请告诉我们。 –

+1

为了使事情更清楚,我尝试了以下所有内容,并且仍然会遇到在执行任何需要'fmt-merge-msg'运行的类型的git动作时,会阻止git动作完成:通过'smb_neg = smb1_only'通过smb_neg = smb1_only'回应,通过@lll回答,通过cifs挂载,使用automount config'd auto_smb fstype = cifs,fstype = smbfs,fstype = smb,cifs://,smb://),使用自制软件安装了smb3,尝试了一个新克隆的repo [github](http://bit.ly/)。 Leetp5),没有什么效果,奇怪的是,通过'/ Volumes/C' wo连接'prlufs' rks ... – psyrendust