Git pull挂在SMB共享存储库上

时间:2014-01-07 13:51:35

标签: macos git bitbucket macports msysgit

当我运行git pull时,我明白了:

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' 'git@bitbucket.org' '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),它可以正常工作。

有任何线索吗?

3 个答案:

答案 0 :(得分:4)

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

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
    
  4. 或者,您可以创建一个辅助函数来自动执行上述步骤。您可以将其放在.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 :(得分:3)

Apple与小牛队转而使用SMB2,对于不少人来说,这种方式并不是很好。作为替代方案,这里有一个更永久的修复,你可以应用而不是cifs://的临时修复:

强制所有连接为SMB1:

打开终端窗口 粘贴在以下行,后跟返回键(应该全部在一行):

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

该命令的作用:

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

如何删除变通方法

打开终端窗口 在提示符处粘贴以下内容,然后点击返回按钮:

rm ~/Library/Preferences/nsmb.conf

注意:source

  

在尝试连接到您的Mac之前重启Mac是一个好主意   再次存储。这将清除以前任何挂起的SMB流程   在实现此操作之前尝试连接到您的存储   解决方法。


  

编辑:OP回复“它没有帮助” - 不是最好的选择,但你明白了。

答案 2 :(得分:0)

Mavericks已经知道SMB协议存在问题。尝试将仓库装载为cifs://vm.ip而不是smb://vm.ip (source)