2014-01-07 118 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