мерзавец удаляет самые старые изменения файла

Открывайте, импортируйте, редактируйте, объединяйте, конвертируйте документы Acrobat PDF с помощью нескольких строк кода, используя интуитивно понятный API Ultimate PDF. Используя на 100% управляемый код, написанный на C #, компонент использует многочисленные встроенные функции .NET Framework для повышения производительности. Более того, библиотека совместима с CLS и не использует небезопасных блоков для минимальных требований к разрешениям. Занятия полностью документированы с подробным примером кода, который помогает сократить вашу кривую обучения. Если ваша среда разработки Visual Studio, наслаждайтесь полной интеграцией онлайн-документации. Просто пометьте или выберите ключевое слово и нажмите клавишу F1 в вашей IDE Visual Studio, и онлайн-документация будет отображена мгновенно. Высокопроизводительная и надежная библиотека PDF, которая позволяет легко добавить функциональность PDF в ваши приложения .NET с помощью нескольких строк кода.

PDF Компонент для NET

20
задан Community 23 May 2017 в 12:19
поделиться

3 ответа

Думаю, вы на правильном пути с командой git filter-branch , которую вы пробовали. Проблема в том, что вы не сказали ему хранить файл ни в каких коммитах, поэтому он удаляется из всех. Я не думаю, что есть способ напрямую указать git-filter-branch пропустить любые коммиты. Однако, поскольку команды запускаются в контексте оболочки, не должно быть слишком сложно использовать оболочку для удаления всех ревизий, кроме последнего числа X. Примерно так:

KEEP=10 I=0 NUM_COMMITS=$(git rev-list master | wc -l) \
git filter-branch --index-filter \
'if [[ ${I} -lt $((NUM_COMMITS - KEEP)) ]]; then
     git rm --cached --ignore-unmatch big_manual.txt;
 fi;
 I=$((I + 1))'

Это сохранит big_manual.txt в последних 10 коммитах.

При этом, как уже упоминал Чарльз, я не уверен, что это лучший подход, поскольку вы фактически отменяют всю суть VCS, удаляя старые версии.

Вы уже пробовали оптимизировать репозиторий git с помощью git-gc и / или git-repack ? Если нет, то, возможно, стоит попробовать.

16
ответ дан 30 November 2019 в 00:19
поделиться

Вы можете рассмотреть возможность использования подмодулей git . Таким образом, вы можете хранить изображения и другие большие файлы в другом репозитории git, а репозиторий с исходными кодами может ссылаться на конкретную ревизию этого другого репозитория.

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

3
ответ дан 30 November 2019 в 00:19
поделиться

Примечание: этот ответ касается сокращения истории всего проекта, а не удаления одного файла из более старой истории, о чем был вопрос!


Самый простой способ сократить историю всего проекта с помощью git filter-branch - это использовать механизм графтов (см. макет репозитория документацию ) для сокращения истории:

$ echo "$commit_id" >> .git/info/grafts

где $ commit_id - это фиксация, которую вы хотите использовать в качестве root (первой фиксации) нового репозитория. Проверьте с помощью «git log» или графического средства просмотра истории, такого как gitk, что история выглядит так, как вы хотите, и запустите «git filter-branch --all»; использование графтов описано в документации git-filter-branch.

Или вы можете использовать мелкий клон , используя параметр - depth для git clone .



Вы можете использовать ] grafts , чтобы удалить историю части одного файла (что изначально было запрошено), используя шаги, описанные ниже. Это решение состоит из большего количества шагов, чем решение , предложенное Дэном Молдингом , но каждый из шагов проще, и вы можете проверить промежуточные шаги с помощью «git log» или графической программы просмотра истории.

  1. Сначала выберите точку, где вы хотите удалить файл, и отметьте эти коммиты, создав ветки в этих точках. Например, если вы хотите, чтобы файл впервые появлялся в коммите f020285b и удалял его из всех его предков, отметьте его предком (при условии, что это обычное дело,

  2. Во-вторых, удалите файл из истории, начиная с cleanup (т.е. f020285b ^ ) с помощью git-filter-branch, как показано в разделе «Примеры» git -filter-branch страница руководства:

     $ git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_manual.txt' очистка
    

    Если вы хотите удалить также все коммиты, которые были изменены только для удаленного файла, вы можете дополнительно использовать параметр - prune-empty для git-filter-branch.

  3. Затем присоединитесь к перезаписанной части история с остальной историей с использованием механизма графтов:

     $ echo $ (git-rev-parse f020285b) $ (git rev-parse cleanup) >> .git / info / grafts
    

    Затем вы можете изучить историю болезни, чтобы проверить, правильно ли она соединена.

  4. Наконец, сделайте трансплантаты постоянными (это сделает все трансплантаты постоянными, но давайте предположим, что в противном случае вы не используете трансплантаты), используя git-filter- ветка,

     $ git filter-branch cleanup..HEAD
    

    и удалите трансплантаты (поскольку они больше не нужны), а также ветвь cleanup

     $ rm .git / info / grafts
    $ git branch -d очистка
    

Последнее замечание: если вы удалите часть истории какого-либо файла, вам лучше убедиться, что проект без этого файла имеет смысл (и, например, правильно компилируется).

15
ответ дан 30 November 2019 в 00:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: