Git загадочно удаляет вещи (редактировать: на самом деле django-storages)

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

Фон:

  • У меня есть (частный) проект с несколькими ответвлениями: «релиз», «разработка», несколько функциональных линий.
  • Двое из нас (я и @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, и в процессе (возможно, обратное слияние от мастера к разработке) все дерево /static/ было удалено.

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

    3) Иногда простое слияние из функциональной ветки для разработки, так как промежуточное слияние может вызвать его. Хотя чаще всего это происходит при нарезке нового релиза.

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

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

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

[core]
   repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = [email protected]: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/_*

person Joe    schedule 06.02.2012    source источник
comment
@sehe это был всего лишь мимолетный комментарий! Я включу дополнительную информацию в вопрос. И извините, это не публичное репо.   -  person Joe    schedule 06.02.2012
comment
@stevejalim @Joe - ok жаль, что вы не можете сослаться на репозиторий с проблемой. Я бы просмотрел find .git/ -print0 | xargs -0 grep -w static и git log -- static/, особенно убедившись, что каталог никогда не бывает технически пустым. Пустые каталоги не отслеживаются git. Кроме того, я бы подумал, что редкие проверки или подмодули играют с вами злые шутки.   -  person sehe    schedule 06.02.2012
comment
Кстати, вы можете «устранить» настоящую проблему, выполнив git filter-branch удаление вещей, которые вы не хотите выставлять напоказ. Это серьезно помогло бы вам получить ответ, если бы вы могли упаковать его в крошечный общий репозиторий. (см. progit.org/book/ch9-7.html#removing_objects)   -  person sehe    schedule 06.02.2012
comment
Спасибо, сехе - позже я рассмотрю обе вещи, которые вы предлагаете. Я боюсь, что мы никак не сможем сделать текущий репозиторий общедоступным, и я скептически отношусь к тому, сможем ли мы воспроизвести его в крошечном общем репо — вы предлагаете разветвить и массово удалить из основного репо, оставив всего несколько файлов?   -  person Steve Jalim    schedule 06.02.2012
comment
Если каталог удаляется в одной ветке и не изменяется в другой ветке, он будет удален при слиянии. Может ли это быть причиной?   -  person knittl    schedule 06.02.2012
comment
@knittl да, я думаю, что это может происходить. Но ветки функций всегда отрываются develop и всегда интегрируются обратно. И статический каталог никогда не удаляется нами намеренно.   -  person Joe    schedule 06.02.2012


Ответы (3)


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

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

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

Итак, проблема решена. Еще раз извините за клевету на доброе имя Git!

person Joe    schedule 09.02.2012
comment
Вы отправили отчет об ошибке для django-хранилищ? Вы определенно должны! - person Sven Marnach; 09.02.2012

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

я бы

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

person Ian P    schedule 08.02.2012
comment
Очень интересно. Мы регистрируемся только на двух машинах, и обе по британскому времени. Время никогда не путается. Но, возможно, журнал git каким-то образом был поврежден с будущей датой? Мы рассматриваем возможность перебазирования (если это правильное слово) репозитория в какой-то момент, если проблема станет слишком серьезной. - person Joe; 08.02.2012
comment
git не заботится ни о дате авторства, ни о датах фиксации, когда дело доходит до истории, он заботится только о происхождении фиксации. Плохие даты не могут заставить git выполнять слияния по-другому. - person CB Bailey; 08.02.2012
comment
@CharlesBailey - тогда есть предложения? Я в тупике. (FWIW в журнале нет будущих дат) - person Joe; 08.02.2012
comment
@Joe: Без доступа к вашему репозиторию и полного тестового примера невозможно сказать. - person CB Bailey; 08.02.2012
comment
Да, к сожалению, это может быть. Нет тестового случая, так как это происходит слишком периодически, чтобы можно было выдвинуть гипотезу. Надеялся, возможно, получить совет по проверке. - person Joe; 08.02.2012
comment
git может не заботиться о датах для истории, но когда дело доходит до (рекурсивного) слияния, он должен знать, какая версия является наиболее актуальной. вы можете попробовать загрузить eval версию smart git - интерфейс журнала довольно симпатичный, и вы можете легко увидеть журналы для отдельных файлов и внесенных изменений - хотя никогда раньше не просматривал полные папки - person Ian P; 09.02.2012

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

person Ian P    schedule 17.02.2012