Удаляем случайно закомиченные приватные данные из git репозитория
Однажды, работая с git репозиторием вы можете случайно отправить (закомитить) в репозиторий свои личные логины, пароли или SSH ключи. Конечно, с помощью git rm можно удалить файл, но файл так же будет присутствовать в истории. К счастью есть утилиты которые позволяют удалить файл из git репозитория полностью. В это статье описано как использовать BFG Repo-Cleaner и git-filter-branch для полного удаления файла из git репозитория.
Важно: после того, как файл с приватными данными попал в репозиторий, все данные в нем можно считать скомпроментированными, и необходимо незамедлительно предпринять меры (поменять пароли, и т.д.). Нет возможности проследить успел ли кто либо посмотреть или скачать эти файлы.
git-filter-branch
Начать пожалуй стоит с git-filter-branch , так как эта утилита является частью git и не требует установки.
Переходим в директорию с нужным проектом:
Первое что нужно сделать — это убедится, что у нас самая последняя версия репозитория и нет никаких локальных изменений.
bash:~$ git status On branch master nothing to commit, working directory clean bash:~$ git pull origin master From bitbucket.org:bosha/test-repo * branch master -> FETCH_HEAD Already up-to-date. bash:~$
Предположим, что мы случайно закомитили в репозиторий файл .environment в котором у нас храниться пароль к базе данных. Проект в активной разработке и испольуется тестовая база данных, но по привычке пароль использовали такой же какой для входа в систему или ещё куда либо. Знакомая ситуация? 🙂
После того, как мы убедились что у нас последняя версия и отсутствуют локальные изменений, можно удалять файл:
bash:~$ git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch .environment' \ --prune-empty --tag-name-filter cat -- --all Rewrite d402133542d0f0f1578e916b8a350842cc955870 (4/4) (0 seconds passed, remaining 0 predicted) rm '.environment' Ref 'refs/heads/master' was rewritten Ref 'refs/remotes/origin/master' was rewritten
В результате выполнения этой команды, в каждом коммите репозитория будет удален файл .environment . Если необходимо удалить директорию, то к git rm необходимо добавить ключ -f :
bash:~$ git filter-branch --force --index-filter \ 'git rm -f --cached --ignore-unmatch /' \ --prune-empty --tag-name-filter cat -- --all
Если есть ещё файлы которые необходимо удалить — выполняете эту команду для каждого из них.
Важно: дабы избежать повторения этой неприятной ситуации, файл необходимо добавить в .gitignore :
echo ".environment" >> .gitignore git add .gitignore git commit -m '.environment was added to .gitignore'
Теперь закомитим все наши изменения:
git push origin --force --all
Если использовали теги:
git push origin --force --tags
Важно: после всех проделанных изменений всем остальным кто работал с этим репозиторием, необходимо сделать rebase. Либо удалить свой локальный репозиторий и склонировать его ещё раз. Лучше последнее, так как меньше шансов выстрелить себе в ногу, особенно если в команде есть джуны. 🙂
BFG Repo-Cleaner
BFG Repo-Cleaner — это более простая и легкая альтернатива git-filter-branch для удаления нежелательных файлов из git репозитория. Например, чтобы удалить файл .environment как в примере с git-filter-branch выше:
bfg --delete-files .environment
BFG даже может просмотреть все файлы в репозитории на наличие паролей и заменить их на **REMOVED** :
bfg --replace-text my_passwords.txt`
В результате выполнения этой команды, каждый файл в каждом коммите будет просмотрен и если в нем будет найден пароль из файла my_passwords.txt , то он будет заменен на **REMOVED** .
Выводы
Несмотря на то, что файл и возможно удалить после случайного коммита, этого следует избегать. Есть несколько простых вещей которые стоит избегать, и наоборот использовать:
- Использовать программы с графическим интерфейсом для работы git. Они наглядно показывают какие файлы будут добавлены в коммит. Во всех средах разработки как правило есть либо дополнения, либо встроенные средства для работы с git которые помогают избежать таких ошибок. Если среда разработки которую вы используете не имеет средств работы с git, то есть графические интерефейсы. Я когда-то писал небольшой обзор графических интерфейсов для git;
- Избегать таких опасных команд как git add . , git add -A и git commit -a . Вместо них добавлять отдельные файлы с git add ;
- Использовать git add —interactive чтобы интерактивно просматривать и добавлять файлы;
- Перед добавлением файлов внимательно просматривать какие файлы были изменены и могут попасть в коммит git status .
Полезные ссылки:
- Справочная страница git-filter-branch ;
- Pro Git: Git Tools — Rewriting History;
- Официальная страница BFG Repo-Cleaner.
Удалить файл из репозитория
Загрузил в удаленный репозиторий (github) файл с кодами application.yml. Как мне удалить его оттуда и перестать отслеживать изменения на нем?
Отслеживать
3,521 12 12 серебряных знаков 20 20 бронзовых знаков
задан 15 июн 2016 в 10:03
1,197 3 3 золотых знака 16 16 серебряных знаков 31 31 бронзовый знак
15 июн 2016 в 12:07
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
- Добавьте файл в .gitignore
- git rm —cached —ignore-unmatch application.yml — удаляем файл только из репозитория, и физически файл сохранится на диске
- git commit -am «Message»
- git push origin
Отслеживать
ответ дан 15 июн 2016 в 10:30
3,521 12 12 серебряных знаков 20 20 бронзовых знаков
Выполнил вторую команду. Файл удалился вообще, мне из репозитория надо удалить, а на диске оставить.
18 июн 2016 в 13:20
Удалять файл с диска он не должен, но ответ я дополнил
19 июн 2016 в 9:51
Удалить у себя и сделать commit и push. И, таки да, не удалить, а в .gitignore его
Отслеживать
ответ дан 15 июн 2016 в 10:09
Hermann Zheboldov Hermann Zheboldov
1,116 9 9 серебряных знаков 22 22 бронзовых знака
Сначала удалить, а потом в .gitignore. Иначе не поможет.
15 июн 2016 в 10:24
-
Важное на Мете
Связанные
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
git rm и git mv — удаление и переименование в Git
Еще один важный практический вопрос при работе с Git — это операции с файлами.
git rm
git mv
Команда git rm
git rm
Как хорошо известно, в системе Git файл может одновременно существовать в трех ипостасях: в области “Working Directory”, в области “Staging Area”, в области “Repository”. Удаление файла из области “Working Directory” не приведет к его удалению из областей “Staging Area” и “Repository”.
Поэтому, чтобы удалить файл, нужно (в идеале) выполнить три команды подряд для удаления файла из Рабочей области “Working Directory”, затем из области индекса “Staging Area” и потом из области репозитория “Repository”:

index.html
git mv

git rm
git mv
Jest — использование skip
В Karma\Jasmine есть варианы для игнорирования выборочных тестов — xit, xdescribe. В этом посте — разберусь, какие есть варианты для этог. … Continue reading
Удаление файлов в репозитории
Вы можете удалить отдельный файл или весь каталог в репозитории на GitHub.
Кто может использовать эту функцию.
People with write permissions can delete files or directories in a repository.
About file and directory deletion
You can delete an individual file in your repository or an entire directory, including all the files in the directory.
If you try to delete a file or directory in a repository that you don’t have write permissions to, we’ll fork the project to your personal account and help you send a pull request to the original repository after you commit your change. For more information, see «About pull requests.»
If the file or directory you deleted contains sensitive data, the data will still be available in the repository’s Git history. To completely remove the file from GitHub, you must remove the file from your repository’s history. For more information, see «Removing sensitive data from a repository.»
Deleting a file
- Browse to the file in your repository that you want to delete.
- In the top-right corner, select the

dropdown menu, then click Delete file.


Below the commit message fields, decide whether to add your commit to the current branch or to a new branch. If your current branch is the default branch, you should choose to create a new branch for your commit and then create a pull request. For more information, see «Creating a pull request.»
Deleting a directory
- Browse to the directory in your repository that you want to delete.
- In the top-right corner, select the

dropdown menu, then click Delete directory.


Below the commit message fields, decide whether to add your commit to the current branch or to a new branch. If your current branch is the default branch, you should choose to create a new branch for your commit and then create a pull request. For more information, see «Creating a pull request.»