Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Убрать каталоги venv, .idea, __pycache__ из репозитория #4
Как удалить папку из удаленного репозитория git
Если вы хотите удалить директорию из удаленного репозитория, но оставить её на вашем компьютере (например, вы ошибочно запушили директорию с локальным окружением .venv ), то выполните следующие команды
rm --cached -r git commit -m "remove имя_директории from repository" git push origin main
Также добавьте имя директории или паттерн для исключения в .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
- Ответить на это сообщение
- Ссылка

Что нужно сделать, чтобы и вторая команда правильно выполнилась?
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 )
- Ответить на это сообщение
- Ссылка
Git и Github. Простые рецепты
При разработке собственного проекта, рано или поздно, приходится задуматься о том, где хранить исходный код и как поддерживать работу с несколькими версиями. В случае работы на компанию, обычно это решается за вас и необходимо только поддерживать принятые правила. Есть несколько общеупотребимых систем контроля версий, и мы рассмотрим одну из самых популярных — это Git и сервис Github.
Система Git появилась, как средство управления исходными текстами в операционной системе Linux и завоевала множество поклонников в среде Open Source.
Сервис Github предоставляет хостинг (хранение) исходных текстов как на платной, так и на бесплатной основе. Это одна из крупнейших систем, которую любят Open Source пользователи. Основное отличие платной версии — это возможность создания частных репозиториев (хранилищ) исходных текстов и если вам скрывать нечего, то можете спокойно пользоваться бесплатной версией.
После того, как вы начали работу над проектом и написали какой-то работающий прототип, у вас появится желание сохранить результаты работы. Это так же может быть полезно в случае, если вы захотите продолжить работу на другом компьютере. Самое простое решение — это сохранить все на флешке. Этот вариант неплохо работает, но если есть подключение к интернету (а сейчас у кого его нет), то удобно воспользоваться системами Git/Github.
В этой статье будут описаны базовые сценарии использования систем Git/Github при работе над проектом в среде Linux с помощью командной строки. Все примеры проверялись на системе с Linux Ubuntu 14.04 и Git 1.9.1. Если вы пользуетесь другим дистрибутивом, то возможны отличия.
Создание локального репозитория
Предположим, что ваш проект находится в папке /home/user/project. Перед тем, как сохранять исходники, можно посмотреть, нет ли временных файлов в папке с проектом и по возможности их удалить.
Для просмотра папки удобно воспользоваться командой tree, которая покажет не только содержимое каждой папки, но и древовидную структуру директорий.
Часто временные файлы содержат специфические суффиксы, по которым их легко обнаружить и в последствии удалить. Для поиска таких файлов можно воспользоваться командой find. В качестве примера посмотрим, как найти все файлы, которые генерируются компилятором Python и имеют расширение .pyc
Переходим в папку с проектом /home/user/project:
cd /home/user/project
И показываем список файлов с расширением .pyc:
find . -name *.pyc
Эта команда выведет список всех файлов с расширением .pyc в текущей директории и в ее поддиректориях. Для удаления найденных файлов, достаточно добавить ключ -delete к этой команде:
find . -name *.pyc -delete
Очень рекомендуется не спешить и сразу ключ этот не добавлять. Первый раз вызвать команду для просмотра файлов и только убедившись, что в список не попало ничего полезного добавить ключ удаления.
Создадим локальный репозиторий в папке с проектом:
git init
После выполнения этой команды появится новая папка с именем .git. В ней будет несколько файлов и поддиректориев. На данный момент система управления версиями еще не видит наших файлов.
Добавление файлов в локальный репозиторий
Для добавления файлов используется команда:
git add readme
После выполнения команды, файл readme будет добавлен в систему управления версий (конечно если он уже был то этого в проекте). При добавлении файла генерируется хеш значение, которое выглядит примерно так:
9f2422325cef705b7682418d05a538d891bad5c8
Добавленные файлы хранятся в папке .git/objects/xx/yyyyyyyy, при этом первые 2 цифры хеша ипользуются для указания директории, а остальное хеш значение является именем файла. Наш добавленный файл будет находится здесь:
.git/objects/9f/2422325cef705b7682418d05a538d891bad5c8
Что легко увидеть с помощью команды:
ls .git/objects
Сам файл является архивом, который легко распаковать и вывести на экран, указав полное значение хеша.
git cat-file -p 9f2422325cef705b7682418d05a538d891bad5c8
Для того, чтобы добавить все файлы из текущей директории введите:
git add .
Если нужно добавить файлы из текущей директории и из всех поддиректориев, то используйте:
git add --all
Для того, чтобы в систему не попадали временные файлы, можно их занести в файл .gitignore, который нужно создать самостоятельно и разместить в корневом каталоге проекта (на том же уровне, что и .git директория).
Например, если в в файл .gitignore добавить следующую строчку *.pyc, то все файлы с расширением .pyc не будут добавляться в репозиторий.
После добавления файлов, все изменения находятся в так называемой staging (или cached) area. Это некоторое временнное хранилище, которое используется для накопления изменений и из которого создаются собственно версии проектов (commit).
Для просмотра текущего состояния можно воспользоваться командой:
git status
После выполнения команды мы увидим, что в stage area находится наш файл:
new file: readme
Если вы продолжите вносить изменения в файл readme, то после вызова команды git status вы увидите две версии файла.
new file: readme modified: readme
Чтобы добавить новые изменения достаточно повторить команду. Команда git add не только добавляет новые файлы, но и все изменения файлов, которые были добавлены ранее.
git add readme
Можно отменить добавления файла readme в staging area с помощью команды:
git rm --cached readme
После выполнения команды, файл readme отметится, как неизмененный системой.
Создание версии проекта
После того, как мы добавили нужные файлы в staging area мы можем создать версию проекта. С помощью команды:
git commit -m "comment"
Каждая новая версия сопровождается комментарием.
После коммита, мы сможем найти два новых объекта внутри .git репозитория.
.git/objects/9f/2422325cef705b7682418d05a538d891bad5c8 .git/objects/65/7ab4c07bd3914c7d66e4cb48fe57f5c3aa7026 .git/objects/da/c6721c3b75fcb3c9d87b18ba4cef2e15e0a3d3
Посмотрим, что внутри:
git cat-file -t 657ab4c07bd3914c7d66e4cb48fe57f5c3aa7026
Ключ -t показывает тип объекта. В результате мы видим:
commit
Для второго объекта:
git cat-file -t dac6721c3b75fcb3c9d87b18ba4cef2e15e0a3d3
tree
Для самого первого файла:
git cat-file -t 9f2422325cef705b7682418d05a538d891bad5c8
blob
Если мы будем дальше изучать содержимое этих файлов, то обнаружим древовидную структуру. От каждого коммита можно по ссылкам пройти по всем измененным файлам. Для практического применения это не очень нужно, но возможно так будет легче понять, что происходит при работе с системой Git.
Самую первую версию отменить нельзя. Ее можно только исправить. Если вы хотите добавить изменения в последнюю версию, то после выполнения команды commit, добавляете необходимые изменения и вызываете:
git commit -m "comment" --amend
git commit --amend --no-edit
Ключ —no-edit нужен, чтобы не вводить заново комментарий.
Можно просмотреть изменения, которые вы внесли последним коммитом:
git show
git show --name-only
Ключ —name-only нужен, чтобы показывать только имена измененный файлов. Без него по каждому измененнному файлу будет выдан список всех изменений.
Если вы продолжили работать и изменили только те файлы, которые были уже добавлены в систему командой git add, вы можете сделать коммит одной командой:
git commit -a -m "comment"
Для просмотра списка всех коммитов, воспользуйтесь командой:
git log
git log --oneline
Ключ —oneline нужен, чтобы уменьшить количество информации выдаваемой на экран. С этим ключем каждый коммит показывается в одну строчку. Например:
2b82e80 update 657ab4c first
Для того, чтобы просмотреть изменения по конкретному коммиту, достаточно в команду git show добавить хеш значение коммита, которое можно получить с помощью предыдущей команды.
git show 657ab4c
Для отмены последнего коммита (кроме самого первого) можно воспользоваться следующей командой:
git reset HEAD~1
Для того чтобы удалить все файлы в папке, которые не относятся к проекту и не сохранены в репозитории, можно воспользоваться командой:
git clean -df
Создание репозитория на Github
До текущего момента мы работали с локальным репозиторием, который сохранялся в папке на компьютере. Если мы хотим иметь возможность сохранения проекта в интернете, создадим репозиторий на Github. Для начала нужно зарегистрироваться на сайте github.com под именем myuser (в вашем случае это может быть любое другое имя).
После регистрации нажимаем кнопочку «+» и вводим название репозитория. Выбираем тип Public (репозиторий всегда Public для бесплатной версии) и нажимаем Create.
В результате мы создали репозиторий на сайте Github. На экране мы увидим инструкцию, как соединить наш локальный репозиторий со вновь созданным. Часть команд нам уже знакома.
Добавляем удаленный репозиторий (по протоколу SSH) под именем origin (вместо origin можно использовать любое другое имя).
git remote add origin git@github.com:myuser/project.git
Можем просмотреть результат добавления с помощью команды:
git remote -v
Если все было правильно сделано, то увидим:
origin git@github.com:myuser/project.git (fetch) origin git@github.com:myuser/project.git (push)
Для того, чтобы отменить регистрацию удаленного репозитария введите:
git remote rm origin
Это может понадобиться, если вы захотите поменять SSH доступ на HTTPS. После этого можно добавить его опять, например под именем github и протоколом HTTPS.
git remote add github https://github.com/myuser/project.git
Следующей командой вы занесете все изменения, которые были сделаны в локальном репозитории на Github.
git push -u github master
Ключ -u используется для того, чтобы установить связь между удаленным репозиторием github и вашей веткой master. Все дальнейшие изменения вы можете переносить на удаленный репозиторий упрощенной командой.
git push
Перенос репозитория на другой компьютер
После того, как репозиторий был создан на Github, его можно скопировать на любой другой компьютер. Для этого применяется команда:
git clone https://github.com/myuser/project.git
Результатом выполнения этой команды будет создание папки project в текущем каталоге. Эта папка также будет содержать локальный репозиторий (то есть папку .git).
Так же можно добавить название папки, в которой вы хотите разместить локальный репозиторий.
git clone https://github.com/myuser/project.git
Работа с одним репозиторием с разных компьютеров
С одним репозиторием с разных компьютеров может работать несколько разработчиков или вы сами, если например работаете над одним и тем же проектом дома и на работе.
Для получения обновлений с удаленного репозитория воспользуйтесь командой:
git pull
Если вы изменили ваши локальные файлы, то команда git pull выдаст ошибку. Если вы уверены, что хотите перезаписать локальные файлы, файлами из удаленного репозитория то выполните команды:
git fetch --all git reset --hard github/master
Вместо github подставьте название вашего удаленного репозитория, которое вы зарегистрировали командой git push -u.
Как мы уже знаем, для того чтобы изменения выложить на удаленный репозиторий используется команда:
git push
В случае, если в удаленном репозитории лежат файлы с версией более новой, чем у вас в локальном, то команда git push выдаст ошибку. Если вы уверены, что хотите перезаписать файлы в удаленном репозитории несмотря на конфликт версий, то воспользуйтесь командой:
git push -f
Иногда возникает необходимость отложить ваши текущие изменения и поработать над файлами, которые находятся в удаленном репозитории. Для этого отложите текущие изменения командой:
git stash
После выполнения этой команды ваша локальная директория будет содержать файлы такие же, как и при последнем коммите. Вы можете загрузить новые файлы из удаленного репозитория командой git pull и после этого вернуть ваши изменения которые вы отложили командой:
git stash pop
Заключение
Мы рассмотрели базовые сценарии работы с системами Git и Github. Каждая приведенная выше команда имеет значительно больше ключей и соответственно возможностей. Постепенное их изучение даст вам возможность легко оберегать свои иходники и больше концентрироваться непосредственно на разработке.
