2014-01-07 5 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' 

Но тогда он просто висит там.

Резервуар (битбакет) находится внутри машины vmware для Windows 7. Затем репозиторий передается через SMB на главный компьютер (mac osx). Я запускаю git pull (macports) на хосте.

Если я запускаю git pull (msysgit) внутри vm, он отлично работает.

Любой ключ?

+1

Я вижу то же самое. Это не происходило последовательно, пока я не перешел на Маверикс. Я думаю, что это может быть проблема с SMB, но не может показаться, что это понятно. – Abe

+0

Теперь, когда вы упоминаете, это происходит чаще, так как я обновился до Маверикс. Кроме того, когда я запускаю git pull внутри vm, иногда репозиторий становится непригодным для хоста (до тех пор, пока я не удаляю .git/index и do git reset) –

ответ

3

В источнике Git, есть, кажется, бесконечный цикл в Git's fmt-merge-msg function когда репо сидит доли SMB, а время доступа от Mavericks. Единственный способ, которым я смог это исправить, - это сделать процесс, который не связан с автоматическим слиянием.

git pull по существу git fetch && git merge все в одной команде. Если вы попытаетесь сделать git fetch в своей текущей ветке, когда произошли изменения, вы можете столкнуться с проблемой, из-за которой сбой git fetch.

Способ, которым я исправил эту проблему, - получить удаленный филиал во временную локальную ветвь и объединить эту временную ветвь в вашу рабочую ветку. См. Следующие сведения о попытках получить последние изменения с вашего origin/master в текущую рабочую ветвь master.

  1. Fetch последние изменения из 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

Mavericks знает проблемы с протоколом Samba. Попробуйте установить репо как cifs://vm.ip вместо smb://vm.ip(source).

+0

Я получаю «Не удалось подключиться к серверу« xxxxx » –

2

Apple переключилась на SMB2 с Mavericks, и это не работает так хорошо для довольно многих людей. В качестве альтернативы, вот более постоянное исправление можно применять вместо временного одной из 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 от предыдущих попыток подключения к вашему хранилищу до использования этого обходного пути .


EDIT: OP ответил "это не полезно" - не самый лучший выбор слов, но вы получите идею.

+1

I ' – psyrendust

+1

@psyrendust, если у вас есть другие журналы или дополнительная информация, сообщите нам об этом. –

+1

Чтобы сделать все более ясным, я пробовал все следующие и все равно буду сталкиваться с проблема, когда выполнение любого типа git-действия, которое требует запускать 'fmt-merge-msg', предотвратит выполнение git-действия: Mavericks SMB2, SMB1 через' smb_neg = smb1_only', как ответил @lll, монтируется через cifs, используя automount (config'd auto_smb с fstype = cifs, fstype = smbfs, fstype = smb, cifs: //, smb: //), установленный smb3 с использованием homebrew, попробовал недавно клонированное репо [github] (http://bit.ly/ Leetp5). Ничего не работает. Как ни странно, соединение через «prlufs», установленное на '/ Volumes/C' wo rks ... – psyrendust

Смежные вопросы