Nano Hash - криптовалюты, майнинг, программирование

Дублирование слияния Git после неэффективного использования BFG

Я каким-то образом глубоко изучил весь репозиторий (используемый только мной) и мог бы помочь в сортировке.

Вот что я сделал. Я понял, что в моей истории коммитов есть несколько файлов, содержащих учетные данные, которые я не хотел просто лежать без дела. Итак, я решил быть законным и попытаться использовать BFG Repo-Cleaner для решения этих проблем. Я закинул все учетные данные в .gitignores и перешел к попытке вычистить их из истории. В соответствии с инструкциями по документации я выполнил следующие команды:

git clone --mirror myrepo.git
java -jar bfg.jar --delete-files stuffthatshouldbedeleted.txt  myrepo.git

В этот момент BFG сообщил мне, что было найдено и удалено x файлов. Сладкий.

cd myrepo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive
git push

Судя по логам терминала, он обновил репо. Пока все хорошо, верно? Я захожу в свою учетную запись github и после нескольких щелчков нахожу учетные данные, файл и все остальное, все еще там, в моей истории. Я возвращаюсь и пробую тот же набор команд, но используя эту строку вместо удаления файлов:

java -jar bfg.jar --replace-text passwords.txt  myrepo.git

где passwords.txt — это файл, содержащий строковые экземпляры всех учетных данных, которые я хотел бы удалить. Опять же, в журналах BFG указано, что было исправлено несколько случаев. Я нажимаю, проверяю, а учетные данные все еще там, сидят в Github. Я заметил, что ключи SHA-1 для всех моих коммитов были изменены, поэтому, предположительно, BFG что-то сделал, но не то, что я хочу.

В этот момент я сдаюсь и пытаюсь вернуться к работе, думаю, я разберусь с этим позже. Я делаю какую-то работу, пытаюсь подтолкнуть, получаю странный конфликт слияния (вы на 50 впереди и на 50 позади по коммитам). Какая? Я пытаюсь вытащить и объединить, и вдруг каждый коммит в моей истории git дублируется по имени, а некоторые из них просто пусты. Я проверяю свой сетевой график Github, и похоже, что есть вторая ветвь, начинающаяся с моего первоначального коммита, которая точно отражает все мои коммиты, которые были застегнуты с моим последним коммитом (я никогда не разветвлялся, просто линейно пыхтел).

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

Я подумываю просто удалить весь репо и начать заново. Я действительно не хочу этого делать.

тлдр; Пытался использовать BFG, каким-то образом продублировал полусырые версии всех коммитов в моем репо, не могу распутать, и, чтобы добавить оскорбление к травме, BFG ничего не сделал и утверждает, что сделал свою работу.


Ответы:


1

Я автор BFG, я попытаюсь описать то, что я думаю, шаг за шагом, основываясь на вашем аккаунте:

Ручная очистка до BFG...

Ты первый:

закинул все учетные данные в .gitignores и перешел к попытке вычистить их из истории.

В этом описании ваших действий пропущены два важных шага:

  1. Вручную удалить учетные данные из вашего текущего файлового дерева и зафиксировать это изменение в своем репо. Если бы вы этого не сделали, BFG уничтожил бы контент из ваших старых коммитов, но защитил грязь в ваших текущих коммитах. Это поведение описано в документации BFG в разделе «Ваш текущий файлы священны...', и если вы забудете это сделать, BFG выдаст предупреждающее сообщение при запуске ("ВНИМАНИЕ: грязное содержимое выше, может быть удален из других коммитов, но поскольку защищенные коммиты все еще используют его, он ВСЕ ЕЩЕ будет существовать в вашем репозитории..." и т. д. и т. д.). Вы видели это сообщение, когда запускали BFG?

  2. Этот коммит должен быть отправлен в ваш репозиторий GitHub, прежде чем вы клонируете полное зеркало вашего репозитория. Вы забыли этот шаг?

Если вы этого не сделали, это будет означать, что ваши учетные данные не были полностью удалены из вашего репозитория.

Первый раз запускаю BFG...

Идем дальше, тогда вы:

  • сделал свежий зеркальный клон вашего репо с GitHub
  • запустил BFG, фильтруя с помощью параметра --delete-files (вы видели предупреждение о защищенном содержимом?)
  • отправил обновленный репозиторий на GitHub

...в какой момент:

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

Итак, если предположить, что вы удали правильно вручную удалить плохой контент из своих последних коммитов перед запуском BFG, то, что вы увидели, довольно странно. Некоторые возможные причины:

а) Репозиторий не был клонирован с флагом --mirror, поэтому не все ветки на GitHub были перезаписаны, оставляя грязную историю в неглавных ветках. Однако вы прямо заявили, что использовали флаг --mirror.

б) Даже при зеркальной отправке на GitHub старые коммиты по-прежнему доступны там, если на них ссылается явный идентификатор коммита (т. е. URL-адрес GitHub, в котором есть идентификатор коммита), вплоть до момента GitHub выполняет автоматическую сборку мусора в вашем репозитории. Пулл-реквесты и форки также могут сохранить коммиты из старой истории. Это было бы еще одним возможным объяснением грязных коммитов, которые вы видели.

Запускаю BFG во второй раз...

В любом случае, в тот момент вы были обеспокоены, и:

  • снова запустил BFG, на этот раз с --replace-text passwords.txt, который обновляет содержимое файла, а не удаляет его целиком.

Опять же, в журналах BFG указано, что было исправлено несколько случаев. Я нажимаю, проверяю, а учетные данные все еще там, сидят в Github.

Немного любопытно, что BFG сказал, что было больше контента, который нужно удалить - возможно, ваши учетные данные были в большем количестве мест, чем вы думали, - но в любом случае, какой бы ни была причина, по которой вы видели их все еще после первого запуска, это по той же причине, по которой вы видели их после второго прогона.

Возвращение к работе

В этот момент я сдаюсь и пытаюсь вернуться к работе, думаю, я разберусь с этим позже.

Итак, на данный момент вы переписали историю своего репозитория Git (дважды!) и отправили ее на GitHub. Но в вашей учетной записи не упоминается, что вы удалили все свои локальные старые копии репозитория, как указано в инструкциях BFG:

"На данный момент вы готовы к тому, что все избавятся от своих старых копий репозитория и создадут новые клоны новых, нетронутых данных".

Итак, вы удалили свою старую рабочую копию репозитория Git на своем рабочем компьютере и повторно клонировали с новой историей репозитория Git? История в вашем старом репозитории будет отличаться от "очищенной" истории, которая была бы представлена ​​в GitHub на тот момент (даже если "очищенная" история не была такой "очищенной", как вы хотели бы). понравилось!).

Я делаю какую-то работу, пытаюсь подтолкнуть, получаю странный конфликт слияния (вы на 50 впереди и на 50 позади по коммитам).

Если бы вы выполняли работу в старой локальной копии вашего репозитория Git (а не в свежем повторном клоне из GitHub), то вы бы увидели это. По сути, вы отправляете на GitHub 50 коммитов со старой, грязной историей, а для Git вы, кажется, в блаженном неведении о том, что в этой ветке уже есть 50 совершенно разных (для Git, который заботится только об идентификаторах коммитов) коммитов. Git думает, что вы делаете немного странно («на 50 вперед и на 50 позади») и пытается вам это сказать.

Делать хуже...

Какая? Я пытаюсь вытащить и объединить, и вдруг каждый коммит в моей истории git дублируется по имени, а некоторые из них просто пусты. Я проверяю свой сетевой график Github, и похоже, что есть вторая ветвь, начинающаяся с моего первоначального коммита, которая точно отражает все мои коммиты, которые были застегнуты с моим последним коммитом.

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

Последствия

Когда я сейчас пытаюсь запустить BFG с самого начала, заново клонируя и зеркалируя репозиторий, он мне говорит, что в нем нет учетных данных, несмотря на то, что я их вижу в Github.

Это довольно странно, но на самом деле у меня нет никакого объяснения этому, кроме ошибки оператора, помимо объяснения «GitHub gc», уже приведенного выше. Вы можете поделиться со мной репозиторием (если хотите), чтобы я мог провести более детальную проверку, или просто пришлите мне заархивированную копию каталога '.bfg-report', чтобы я мог увидеть, какую диагностику BFG зафиксировал при его выполнении.

Восстановление

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

Надеюсь, мне удалось объяснить кое-что из того, что произошло.

Что касается сортировки вашей истории (т.е. избавления от этих двух повторяющихся цепочек), вам нужно сбросить историю Git обратно до (очищенной) точки, прежде чем вы добавили этот коммит слияния. Посмотрите на фиксацию слияния и определите, какую родительскую историю вы предпочитаете. Какая последняя фиксация (xxxx) в этой истории перед слиянием?

git reset --hard master xxxx

Это вполне может привести к потере последней части вашей старой, грязной истории. Определите этот коммит (yyyy) и перебазируйте его поверх вашей истории или просто выберите его:

git cherry-pick yyyy

Наконец, отправьте восстановленную историю на GitHub с флагом «force»:

git push origin master -f

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

03.07.2014
  • Большое спасибо за подробное объяснение. Ошибка, которую я сделал, заключалась в том, что я забыл удалить свою локальную копию, а затем не был осторожен с предупреждениями об ошибках, когда пытался продолжить работу и обновить свое репо. В итоге я просто выбросил старый и перекинул все в новое репо. Поскольку я единственный участник этого проекта, это было скорее потерей очков Github, чем чем-то действительно важным. Опять же, я очень ценю ваше время и подробное объяснение, я с нетерпением жду возможности использовать BFG (Великолепное имя!) более осторожно в будущем! 04.07.2014
  • Кроме того, сборка мусора на Github, вероятно, является причиной того, что у меня все еще были учетные данные. Раньше я не знал, как это работает в полной мере. Спасибо! 04.07.2014
  • Что бы это ни стоило, шаги восстановления сработали для меня. У меня была точно такая же проблема. Это научит меня читать все инструкции. 30.10.2015
  • У меня похожая ситуация, когда я запускал replace-text несколько раз с разными строками. Опубликовано здесь =1#comment58145024_35214238" title="заменил текст на bfg, и теперь он показывает, что моя вилка состоит из нескольких сотен коммитов, ахеа"> stackoverflow.com/questions/35214238/, а затем я нашел это. Я думал о git reset --hard master для последнего коммита перед моей вилкой, а затем выбирать все мои более поздние коммиты. Я получаю фатальное сообщение: невозможно выполнить полный сброс с путями. 05.02.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..