Git таинственным образом удаляет вещи (правка: фактически django-хранилища) - PullRequest
11 голосов
/ 06 февраля 2012

Проблема: иногда, но не каждый раз, Git удаляет каталог static репо.Мы не уверены, что это вызывает, но, похоже, это происходит при слиянии между ветвями или иногда даже при проверке ветвей.Он делает это без запроса и ест отслеживаемые файлы.

Фон:

  • У меня есть (частный) проект, который имеет несколько веток 'release', 'development',несколько характерных линий.
  • Мы двое (я и @stevejalim) работаем над репо.Эта проблема случается с нами обоими.
  • Я использую только командную строку для своих команд git;Стив использует смесь командной строки и Git Tower.
  • Это проект Django с каталогом static.Мы могли бы git rm редактировать каталог static в некоторый момент в прошлом или поместить его в .gitignore, но не в последнее время.И у главы нашего отдела разработки нет static в .gitignore и есть файлы в static отслеженных.
  • Это случается так редко, что мы не уверены, что мы что-то делаемили периодически возникающая проблема, ошибка в Git или поврежденное дерево
  • Это может произойти только при объединении другой ветви обратно в develop.Но ветви всегда разветвляются от develop и обратно в develop.Но мы не уверены.
  • Мы используем git-flow, но проблема возникает и при использовании не-git-flow команд.

  • В качестве примеров того, когда это может ударить:

    1) У Стива была ветвь разработки, которая была чистой (без изменений для коммита или этапа) и стабильной.Он вырезал новую версию с git flow release start|finish, и в процессе (возможно, обратное слияние с мастером для разработки) все / статическое / дерево было удалено.

    2) Стив восстановил удаление, отменив изменения(чтобы по существу восстановить файл).Но затем Стив просто переключился с мастера обратно на разработку, и / static / dir снова был зарезан (это было с Git Tower)

    3) Иногда простое слияние из ветви объектов для разработки в качестве временного слияния может вызватьЭто.Похоже, это происходит чаще всего при вырезании нового релиза, хотя

Может ли это быть связано с тем, как мы исправляем zapping / static / dir?Каков наилучший способ удаления удаленных файлов?Кажется, что ни отмена локальных изменений, ни полный сброс к HEAD не излечивают ситуацию.Может ли ребаз помочь нам?

ОБНОВЛЕНИЕ Мы только что повторили это просто с git add . - без смены веток, без слияния.Помогает ли это вообще диагностике?

Вот содержимое .git / config Стива:

[core]
   repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@github.com:foobarbazbam/bar.git
[branch "master"]
    remote = origin
    merge = refs/heads/master
[gitflow "branch"]
    master = master
    develop = develop
[gitflow "prefix"]
    feature = feature/
    release = release/
    hotfix = hotfix/
    support = support/
    versiontag = 
[difftool "tower"]
    cmd = \"/Applications/Tower.app/Contents/Resources/CompareScripts/kaleidoscope.sh\" \"$LOCAL\" \"$REMOTE\"

Вот содержимое .gitignore:

.DS_Store
*.pyc
*.log
*.log.*
*.bak
*~
settings_local.py
/build/
/static_collected/*
/static/uploads/*
/static/theme_files/*
/static/picture/*
pip-log.txt
*.tmproj
*.dot
*.db
*.sublime-project
*.sublime-workspace
/docs/_*

Ответы [ 3 ]

6 голосов
/ 09 февраля 2012

Хорошо, дамы и господа, у меня есть публичное извинение. Мерзавец не был виноват . Я оставлю этот вопрос здесь как урок для других людей, которые могут пройти тот же путь.

Мы использовали серверную часть django-хранилища («плагин», позволяющий Django прозрачно хранить файлы на Amazon S3). Это тест под названием HashPathStorageTest. В результате этого теста удаляется settings.MEDIA_ROOT, который был установлен на ./static. Это неисправно, на мой взгляд. У него нет файлов для делового удаления, которые он не создавал.

Мы выполняли наши тесты, как добропорядочные граждане, перед регистрацией. Большую часть времени мы выполняли только тесты для нашего кода, но иногда мы запускали тесты для всего проекта (включая сторонние плагины). Это было причиной поведения в вопросе. Поскольку мы запускали тесты и git вместе, было нелегко определить, какая команда выполняла удаление (а удаленные файлы показывались только при запуске git status).

Итак, проблема решена. Опять же, извините за то, что бросил оскорбления на доброе имя Git!

0 голосов
/ 17 февраля 2012

Хорошо, так что это только что произошло - я добавляю отдельный ответ, потому что это так глупо.У нас есть репозиторий для наших SQL-скриптов, и новый разработчик случайно отредактировал .gitignore, чтобы он содержал * .sql - разумеется, что изменения перестали распространяться в этой ветке - и, к счастью, он был обнаружен до какой-либо значительной потери времени разработки.Однако не исключено, что это может привести к проблемам, описанным выше, - так вы проверили файлы директивы git?Если папка игнорируется (и .gitignore тоже там - т.е. игнорируется), она может исчезнуть и снова появиться почти по волшебству.

0 голосов
/ 08 февраля 2012

Может показаться, что git решает объединиться с веткой, в которой A) удалена папка B) она считает, что она более свежая, чем ветка, в которую вы сливаетесь.Может ли быть машина с американским типом даты и с европейским типом даты?Или какое-либо из ваших испытаний включает сброс даты и времени машины?

Я бы

a) проверил регионы всех машин, включенных в вашу разработку.б) выберите в своей разработке фиксированную точку, скопируйте файлы, создайте новый репозиторий и перейдите оттуда.

...