当我运行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),它可以正常工作。
有任何线索吗?
答案 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
的最新更改。
从origin master
获取最新更改到名为master_merge_tmp
的本地分支。 git fetch [<remote loc>] [<remote branch>]:[<local branch>]
允许您在不自动调用fmt_merge_msg
的情况下获取最新更改,并且您可以定位不同的本地目标分支:
git fetch origin master:master_merge_tmp
将master_merge_tmp
分支合并到master
:
git merge master_merge_tmp
删除远程分支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 :(得分: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)。