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 и в процеса (вероятно обратното сливане от master към development), цялото /статично/ дърво беше изтрито.

    2) Стив поправи изтриването, като отхвърли промените (за да възстанови по същество файла). Но след това Стив просто превключи от master обратно към development и директорията /static/ беше затворена отново (това беше с Git Tower)

    3) Понякога просто сливане от клон на функция, за да се развие като междинно сливане, може да го задейства. Изглежда обаче, че се случва най-често при рязане на нова версия

Възможно ли е да е свързано с това как поправяме затварянето на /static/ dir? Кой е най-добрият начин за групово възстановяване на изтритите неща? Нито отхвърлянето на локалните промени, нито хардуерното нулиране до HEAD изглежда лекува нещата. Може ли повторното базиране да ни помогне?

АКТУАЛИЗАЦИЯ Току-що изпитахме това отново просто с git add . - без промяна на клонове, без сливане. Това помага ли изобщо за диагнозата?

Ето съдържанието на .git/config на Steve:

[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
Благодаря sehe - ще разгледам и двете неща, които предлагаш по-късно. Страхувам се, че няма начин да направим текущото репо публично и съм скептичен дали бихме могли да го репликираме в малко споделено репо - предлагате ли разклоняване и масово изтриване от основното репо, оставяйки само няколко файла?   -  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-storages? Определено трябва! - person Sven Marnach; 09.02.2012

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

бих

а) проверете регионите на всички машини, включени във вашата разработка. b) изберете фиксирана точка във вашата разработка, копирайте файловете и създайте ново хранилище и продължете от там.

person Ian P    schedule 08.02.2012
comment
Много интересно. Чекираме се само на две машини и двете работят по британско време. Времето никога не се бърка. Но може би git log-ът се е повредил по някакъв начин, с бъдеща дата? Обмисляме повторно базиране (ако това е точната дума) на хранилището в даден момент, ако проблемът стане твърде голям проблем. - 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