Как удалить pycache из репозитория
Перейти к содержимому

Как удалить pycache из репозитория

  • автор:

Removing __pycache__ from git repository

You cannot remove files from existing commits: those commits are frozen for all time. You can make sure you do not add new files to future commits, though. Simply remove the files now, with git rm -r —cached __pycache__ , and list __pycache__ or __pycache__/ in your .gitignore (creating this .gitignore file if needed). Do this for each __pycache__ directory; use your OS’s facilities to find these (e.g., find . -name __pycache__ -type d ). Then git add .gitignore and git commit to commit the removal.

Note that any time anyone moves from any commit that has the files—where they’ll be checked out—to a commit that lacks the files, they will have their entire __pycache__ directory removed if Git is able to do that; at the least, any cached files that were committed and can be removed will be removed. So the —cached in the git rm -r —cached above only speeds things up for you by avoiding the removal of the cached compiled files this time. Others will have to rebuild their cache.

To make a new and different repository in which the __pycache__ files were ever accidentally committed in the first place, use git filter-branch (which is now deprecated) or the newfangled git filter-repo (which is not yet distributed with Git). Or, see any of these various existing questions and their answers, which you should already have found before you asked this:

  • Remove a file from a Git repository without deleting it from the local filesystem
  • Applying .gitignore to committed files
  • How can I make Git «forget» about a file that was tracked, but is now in .gitignore?
  • Remove sensitive files and their commits from Git history

Как сделать gitignore для файлов .idea и __pycache__*

введите сюда описание изображения

Для выгрузки на GitHub необходимо убрать папки .idea и pycache ,однако добавив их в gitignore.txt это сделать не получается.

Отслеживать
задан 14 июн 2022 в 10:33
157 1 1 серебряный знак 11 11 бронзовых знаков
pycache и __pycache__ это вообще-то разные вещи
14 июн 2022 в 10:34
Ну и файл должен называться не gitignore.txt , а .gitignore
14 июн 2022 в 10:35
А так же в начале нужно написать команду git init , а если нет гита то установить тут
14 июн 2022 в 10:48

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Не балуйтесь, добавьте уже устоявшуюся готовую «болванку» «.gitignore для python» например, эту

Если же Вы хотите непременно написать .gitignore самостоятельно — то папки добавляются туда со слешом на конце, чтобы отличать их от файлов, например, __pycache__/

Кстати, оказывается, написать и опубликовать .gitignore на github — отличный способ получить офигенно «форкаемый» проект! Тот репозиторий, который я привел в начале ответа, форкнут более 75 тысяч раз!

Также, важное замечание, которое сделал andreymal и которое позволит не биться головой об клавиатуру: файл имеет имя .gitignore . То есть, не gitignore.txt и не gitignore. То, что он начинается с точки, делает его «скрытым». С точки зрения пользователей Windows — это файл без имени и с расширением gitignore

Почему в Git получается удалить из истории только один файл?

Нужно мне в локальном репозитарии удалить из Git несколько pyc-файлов.

Я даю такие команды:

$ git filter-branch --tree-filter 'rm -f configScript/mt2/lib/__pycache__/libCommand.cpython-35.pyc' HEAD Rewrite 72e4719f86a600568a1a387a632a18fbdc1c6c03 (5/5) (1 seconds passed, remaining 0 predicted) Ref 'refs/heads/master' was rewritten $ git filter-branch --tree-filter 'rm -f configScript/mt2/lib/__pycache__/libConfig.cpython-35.pyc' HEAD Cannot create a new backup. A previous backup already exists in refs/original/ Force overwriting the backup with -f 

Видно, что первая команда сработала нормально. А вторая точно такая же команда для другого файла — нет, хотя имя удаляемого файла правильное.

Что нужно сделать, чтобы и вторая команда правильно выполнилась? Видимо, надо перезаписать какой-то бекап, но что и как — неясно.

Xintrea ★★★★★
05.07.22 17:22:10 MSK
Последнее исправление: Xintrea 06.07.22 09:56:23 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Ссылка

Что нужно сделать, чтобы и вторая команда правильно выполнилась?

i-rinat ★★★★★
( 05.07.22 17:28:53 MSK )

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от i-rinat 05.07.22 17:28:53 MSK

В какой-то момент я перестал понимать людей. Ключ -f — это ключ какой команды?

git filter-branch --tree-filter -f 'rm -f configScript/mt2/lib/__pycache__/libConfig.cpython-35.pyc' Cannot create a new backup. A previous backup already exists in refs/original/ Force overwriting the backup with -f 

Xintrea ★★★★★
( 06.07.22 09:24:44 MSK ) автор топика
Последнее исправление: Xintrea 06.07.22 09:25:59 MSK (всего исправлений: 1)

  • Ответить на это сообщение
  • Показать ответы
  • Ссылка

git — это дерьмище. там при каждом коммите добавленный файл сжимается с помощью zlib, а точнее zlib.compress(’blob ’ + размер + текущее содержимое файла) и сохраняется как .git/objects// , а изменения с текущей версией сохраняюися в .git/packs/pack-.pack и .git/packs/pack-.pack , естественно имя файла добавляется в .git/index , его хеш светится .git/refs/heads/master и тп… и сам текст коммита как объект хранится. в общем он хорошенько трахает диск, оверхед довольно большой…

а по самому вопросу:

git rm --cached # удаляет файл из ИНДЕКСА git gc # удаляет из репозитория мусор (git_dir/objects), ну должен 

tz4678_2
( 06.07.22 09:46:05 MSK )
Последнее исправление: tz4678_2 06.07.22 09:49:26 MSK (всего исправлений: 3)

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от Xintrea 06.07.22 09:24:44 MSK

на меня ковид конечно подействовал, но читать хелп по ключам я не разучился

GIT-FILTER-BRANCH(1) Git Manual GIT-FILTER-BRANCH(1) NAME git-filter-branch - Rewrite branches SYNOPSIS git filter-branch [--setup ] [--subdirectory-filter ] [--env-filter ] [--tree-filter ] [--index-filter ] [--parent-filter ] [--msg-filter ] [--commit-filter ] [--tag-name-filter ] [--prune-empty] [--original ] [-d ] [-f | --force] [--state-branch ] [--] [. ] 

На мой взгляд тут все однозначно:

git filter-branch -f —tree-filter ‘rm -f configScript/mt2/lib/__pycache__/libConfig.cpython-35.pyc’

git filter-branch —tree-filter ‘rm -f configScript/mt2/lib/__pycache__/libConfig.cpython-35.pyc’ -f

vel ★★★★★
( 06.07.22 09:48:45 MSK )

  • Ответить на это сообщение
  • Ссылка

Блин, долбаный google, похоже что в какой-то момент они стали понижать количество выдачи релевантных ответов в поиске. Какую-то белиберду подсовывают. Не первый раз такое замечаю, предыдущий раз был в 2014 году кстати. То ли по территориальному признаку это делают, то ли по языковому. Как говорится, в сложные моменты истории пользуйтесь блин отечественным, у Яндекса все в порядке.

В общем, решение следующее.

Из первой команды, которая завершилась удачно, нужно выделить путь:

Ref 'refs/heads/master' was rewritten 

То есть, получаем refs/heads/master.

Из второй команды нужно выделить путь, на который git ругается что он существует:

A previous backup already exists in refs/original/ 

То есть, получаем refs/original.

Соединяем второе с первым: refs/original/refs/heads/master, этот путь понадобится дальше.

Далее надо выполнить команду обновления «Update the object name stored in a ref safely» с полученнымна предыдущем шаге путем:

git update-ref -d refs/original/refs/heads/master 

Все, после этого новая команда git filter-branch . выполнится без ошибок. Но выполнится только одна, после нее опять надо вызывать команду git update-ref . и так далее.

Xintrea ★★★★★
( 06.07.22 09:48:58 MSK ) автор топика

  • Ответить на это сообщение
  • Показать ответ
  • Ссылка

Ответ на: комментарий от Xintrea 06.07.22 09:24:44 MSK

В какой-то момент я перестал понимать людей.

Это печально. Возможно, ты сильно устал, и нужно как следует выспаться.

Ключ -f — это ключ какой команды?

Это ключ для git filter-branch

пробовал так git filter-branch —tree-filter -f ‘rm -f configScript/mt2/lib/__pycache__/libConfig.cpython-35.pyc’

Ключ «–tree-filter» требует значение. Значение представляет собой команду, которая будет выполняться. Раньше у тебя была команда «rm -f …», а теперь ты указал команду «-f». Вряд ли это даст нужный эффект. Для нужного эффекта ключ «-f» стоило указать там, где он опознался бы как именно ключ. Например, до —tree-filter . Или после значения для ключа —tree-filter , то есть после команды «rm …»

i-rinat ★★★★★
( 06.07.22 15:45:00 MSK )

  • Ответить на это сообщение
  • Ссылка

Ответ на: комментарий от Xintrea 06.07.22 09:48:58 MSK

Как говорится, в сложные моменты истории пользуйтесь блин …

Серьёзно. У git-filter-branch не такая уж и большая инструкция, в которой довольно подробно описано поведение утилиты.

i-rinat ★★★★★
( 06.07.22 15:59:54 MSK )

  • Ответить на это сообщение
  • Ссылка

pinkbyte@oas1 ~/dev/test $ git init pinkbyte@oas1 ~/dev/test $ git add 1 pinkbyte@oas1 ~/dev/test $ git commit -m 'initial commit' [master (корневой коммит) c3fe5ee] initial commit 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 1 pinkbyte@oas1 ~/dev/test $ touch 2.err pinkbyte@oas1 ~/dev/test $ git add 2.err pinkbyte@oas1 ~/dev/test $ git commit -m '2.err added' [master c0bbce8] 2.err added 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 2.err pinkbyte@oas1 ~/dev/test $ touch 3.err pinkbyte@oas1 ~/dev/test $ git add 3.err pinkbyte@oas1 ~/dev/test $ git commit -m '3.err added' [master 3edb0fd] 3.err added 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 3.err 

Допустим 2.err и 3.err нам не нужны, не вопрос:

pinkbyte@oas1 ~/dev/test $ git filter-branch -f --tree-filter 'rm -f 2.err 3.err' --prune-empty HEAD pinkbyte@oas1 ~/dev/test $ ls -la итого 0 drwxr-xr-x 1 pinkbyte users 10 июл 6 16:20 . drwxr-xr-x 1 pinkbyte users 548 июл 6 16:15 .. -rw-r--r-- 1 pinkbyte users 0 июл 6 16:15 1 drwxr-xr-x 1 pinkbyte users 128 июл 6 16:20 .git pinkbyte@oas1 ~/dev/test $ git log commit c3fe5eeb1cac04039fe0b9a39294245eb622c6a6 (HEAD -> master) Author: Sergey Popov Date: Wed Jul 6 16:15:46 2022 +0300 initial commit 

Удалились и файлы и пустые коммиты из истории.

Поздновато я правда спохватился(тред-то уже решенный судя по всему), ну да ладно.

Pinkbyte ★★★★★
( 06.07.22 16:27:46 MSK )

  • Ответить на это сообщение
  • Ссылка

Demieno / удаление .pyc .pyo __pycache__ из терминала

Save Demieno/884f0ee4a110422e6a584ec7e3d30f6b to your computer and use it in GitHub Desktop.

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

# добавить код в .bashrc или .zshrc in macOS
# удаляет все файлы .pyc и .pyo и каталоги __pycache__ — использовать команду в терминале в нужном проекте —> pyclean
pyclean ()
find . -type f -name «*.py[co]» -delete
find . -type d -name «__pycache__» -delete
>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Footer

© 2024 GitHub, Inc.

You can’t perform that action at this time.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *