Как Удалить Кэшированные Файлы в Git

GitBeginner
Практиковаться сейчас

Введение

Git – это мощная система контроля версий, которая помогает разработчикам управлять историей файлов своего проекта. Иногда в репозитории кэшируются файлы, которые мы больше не хотим, чтобы Git отслеживал, но при этом мы хотим сохранить их в нашем локальном каталоге. Команда git rm --cached позволяет нам удалить файлы из системы отслеживания Git, сохраняя их в нашей рабочей директории. Этот учебник научит вас эффективно использовать эту команду для очистки вашего репозитория и оптимизации вашего рабочего процесса.

Создание тестового Git-репозитория

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

Понимание кэширования Git

Когда вы добавляете файлы в Git с помощью команды git add, Git сохраняет эти файлы в своем индексе (также называемом областью подготовки, staging area). Эти файлы теперь "закэшированы" или подготовлены (staged), ожидая коммита в репозиторий. Иногда вам может потребоваться отменить подготовку этих файлов или удалить их из отслеживания Git, не удаляя их из вашей локальной файловой системы.

Настройка нашего репозитория

Давайте создадим простой Git-репозиторий для работы:

  1. Откройте окно терминала в среде виртуальной машины LabEx.
  2. Перейдите в каталог проекта:
cd ~/project
  1. Создайте новый каталог для нашего тестового репозитория:
mkdir git-cache-demo
cd git-cache-demo
  1. Инициализируйте новый Git-репозиторий:
git init

Вы должны увидеть вывод, похожий на этот:

Initialized empty Git repository in /home/labex/project/git-cache-demo/.git/
  1. Настройте информацию о пользователе Git (необходима для коммитов):
git config user.name "LabEx User"
git config user.email "labex@example.com"

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

Добавление файлов в репозиторий

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

Создание и добавление файлов

  1. Во-первых, давайте создадим несколько файлов разных типов в нашем репозитории:
## Create a text file
echo "This is a sample text file" > sample.txt

## Create a config file
echo "debug=true" > config.ini

## Create a log file (which we typically don't want to track)
echo "2023-01-01: System started" > app.log
  1. Проверьте статус нашего репозитория:
git status

Вы должны увидеть вывод, похожий на этот:

On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	app.log
	config.ini
	sample.txt

nothing added to commit but untracked files present (use "git add" to track)

Это показывает, что у нас есть три файла, которые Git распознает, но они еще не отслеживаются.

  1. Давайте добавим все файлы в область подготовки (кэш) Git:
git add .
  1. Снова проверьте статус:
git status

Теперь вы должны увидеть:

On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   app.log
	new file:   config.ini
	new file:   sample.txt

Обратите внимание, что Git теперь говорит нам, что мы можем использовать git rm --cached <file> для отмены подготовки файлов. Файлы теперь закэшированы в области подготовки Git, ожидая коммита.

  1. Давайте закоммитим эти файлы, чтобы сделать их частью истории нашего репозитория:
git commit -m "Initial commit with sample files"

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

Удаление одного файла из кэша Git

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

Зачем удалять файлы из кэша Git

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

  1. Вы случайно добавили файл, содержащий конфиденциальную информацию.
  2. Вы хотите исключить большие двоичные файлы, такие как журналы или скомпилированные файлы.
  3. Вы настраиваете файл .gitignore и вам нужно удалить уже отслеживаемые файлы.

Удаление app.log из отслеживания Git

Давайте представим, что мы поняли, что файл app.log не должен отслеживаться Git:

  1. Во-первых, давайте убедимся, что Git в настоящее время отслеживает файл:
git ls-files

Вы должны увидеть все три файла в списке:

app.log
config.ini
sample.txt
  1. Теперь давайте удалим app.log из системы отслеживания Git, сохранив его в нашем локальном каталоге:
git rm --cached app.log

Вы увидите подтверждающее сообщение:

rm 'app.log'
  1. Снова проверьте статус:
git status

Вы увидите, что app.log теперь указан как неотслеживаемый файл:

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    app.log

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	app.log

Это означает, что Git перестанет отслеживать файл в следующем коммите, но файл все еще существует в вашем локальном каталоге.

  1. Давайте убедимся, что файл все еще существует в нашем рабочем каталоге:
ls -la

Вы должны увидеть, что app.log все еще там.

  1. Закоммитьте это изменение, чтобы завершить удаление файла из отслеживания Git:
git commit -m "Remove app.log from Git tracking"
  1. Убедитесь, что Git больше не отслеживает файл:
git ls-files

Теперь вы должны увидеть только:

config.ini
sample.txt

Но файл app.log все еще существует в вашем локальном каталоге:

cat app.log

Вывод:

2023-01-01: System started

Поздравляем! Вы успешно удалили файл из кэша Git, сохранив его в своем локальном каталоге. На следующем шаге мы узнаем, как работать с несколькими файлами и улучшить наш рабочий процесс с помощью .gitignore.

Работа с несколькими файлами и каталогами

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

Создание большего количества файлов для практики

Давайте сначала создадим еще несколько файлов и структуру каталогов для практики:

  1. Создайте каталог и несколько дополнительных файлов:
## Create a directory for temporary files
mkdir temp

## Create some files in the temp directory
echo "This is a temporary file" > temp/temp1.txt
echo "Another temporary file" > temp/temp2.txt

## Create another log file in the main directory
echo "2023-01-02: System updated" > system.log
  1. Добавьте эти новые файлы в отслеживание Git:
git add .
  1. Закоммитьте изменения:
git commit -m "Add temporary files and system log"
  1. Убедитесь, что Git отслеживает все файлы:
git ls-files

Вы должны увидеть:

app.log
config.ini
sample.txt
system.log
temp/temp1.txt
temp/temp2.txt

Удаление нескольких файлов из кэша Git

Теперь предположим, что мы хотим удалить все файлы журналов и весь каталог temp из отслеживания Git.

  1. Удалите файл журнала из отслеживания Git:
git rm --cached system.log
  1. Удалите все файлы в каталоге temp рекурсивно:
git rm --cached -r temp/

Флаг -r важен здесь, поскольку он указывает Git рекурсивно удалить все файлы в каталоге из его кэша.

  1. Проверьте статус:
git status

Вы увидите, что и файл журнала, и все файлы в каталоге temp подготовлены к удалению из системы отслеживания Git:

On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
	deleted:    system.log
	deleted:    temp/temp1.txt
	deleted:    temp/temp2.txt

Untracked files:
(use "git add <file>..." to include in what will be committed)
	system.log
	temp/
  1. Закоммитьте эти изменения:
git commit -m "Remove logs and temp directory from Git tracking"
  1. Убедитесь, что Git больше не отслеживает эти файлы:
git ls-files

Теперь вы должны увидеть только:

app.log
config.ini
sample.txt

Однако все файлы по-прежнему существуют в вашем локальном каталоге:

ls -la
ls -la temp/

Использование .gitignore для предотвращения отслеживания нежелательных файлов

Теперь, когда мы удалили файлы из отслеживания Git, давайте настроим файл .gitignore, чтобы предотвратить их случайное повторное добавление:

  1. Создайте файл .gitignore:
nano .gitignore
  1. Добавьте следующие шаблоны в файл:
## Ignore log files
*.log

## Ignore temp directory
temp/
  1. Сохраните и выйдите (нажмите Ctrl+X, затем Y, затем Enter)

  2. Добавьте и закоммитьте файл .gitignore:

git add .gitignore
git commit -m "Add .gitignore file"

Теперь, даже если вы попытаетесь добавить все файлы в Git, он будет учитывать ваш файл .gitignore и не будет отслеживать указанные шаблоны:

git add .
git status

Вы должны увидеть, что файлы журналов и каталог temp не добавляются в отслеживание Git.

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

Продвинутые методы и лучшие практики

Теперь, когда вы понимаете основы удаления файлов из кэша Git, давайте рассмотрим некоторые продвинутые методы и лучшие практики для улучшения вашего рабочего процесса.

Удаление и игнорирование файлов в один шаг

Если у вас есть файлы, которые уже отслеживаются Git, и вы хотите как удалить их из отслеживания, так и добавить их в файл .gitignore, вы можете использовать этот эффективный подход:

  1. Давайте создадим новый тип файла, который мы хотим игнорировать:
## Create a build directory with some compiled files
mkdir build
echo "Compiled binary data" > build/app.bin
echo "Configuration for build" > build/build.conf
  1. Добавьте эти файлы в Git:
git add build/
git commit -m "Add build files temporarily"
  1. Теперь давайте удалим их из отслеживания Git и обновим наш файл .gitignore в одном рабочем процессе:
## First, edit the .gitignore file to add the build directory
echo "## Ignore build directory" >> .gitignore
echo "build/" >> .gitignore

## Now remove the tracked files from Git's cache
git rm --cached -r build/

## Commit both changes together
git add .gitignore
git commit -m "Remove build directory from tracking and add to .gitignore"
  1. Убедитесь, что файлы больше не отслеживаются, но все еще существуют локально:
git ls-files
ls -la build/

Работа с конфиденциальной информацией

Если вы случайно закоммитили файл с конфиденциальной информацией, такой как пароли или ключи API, удаление его из кэша Git — это только первый шаг. Git хранит историю всех коммитов, поэтому конфиденциальная информация все еще существует в истории вашего репозитория.

Для конфиденциальной информации вам потребуется:

  1. Удалить файл из кэша Git, как мы уже узнали.
  2. Изменить все скомпрометированные пароли или ключи.
  3. Рассмотреть возможность использования таких инструментов, как git filter-branch или BFG Repo-Cleaner, для удаления конфиденциальных данных из истории.

Это выходит за рамки данного руководства, но важно знать об этом ограничении.

Лучшие практики управления кэшем Git

Вот некоторые лучшие практики, которым следует следовать:

  1. Создайте хороший файл .gitignore в начале вашего проекта: Это предотвращает случайное отслеживание нежелательных файлов.

  2. Используйте глобальные файлы .gitignore для общих шаблонов: Вы можете настроить глобальный файл .gitignore, который применяется ко всем вашим репозиториям:

git config --global core.excludesfile ~/.gitignore_global
  1. Будьте осторожны с git add .: Эта команда добавляет все неотслеживаемые файлы. Используйте более конкретные команды, такие как git add <file>, когда это возможно.

  2. Просматривайте изменения перед коммитом: Всегда используйте git status и git diff --cached, чтобы просмотреть то, что вы собираетесь закоммитить.

  3. Используйте псевдонимы для общих операций: Например, вы можете настроить псевдоним для удаления кэшированных файлов:

git config --global alias.uncache 'rm --cached'

Тогда вы можете использовать:

git uncache <file>

С этими методами и лучшими практиками у вас теперь есть всестороннее понимание того, как эффективно управлять кэшем Git для поддержания чистого и эффективного репозитория.

Резюме

В этом руководстве вы узнали, как эффективно использовать команду git rm --cached для удаления файлов из системы отслеживания Git, сохраняя их в вашем локальном каталоге. Вот чего вы достигли:

  1. Настроили репозиторий Git и узнали о концепции кэширования Git.
  2. Добавили файлы в систему отслеживания Git.
  3. Удалили отдельные файлы из кэша Git с помощью git rm --cached.
  4. Управляли несколькими файлами и каталогами с помощью рекурсивной опции (-r).
  5. Использовали .gitignore для предотвращения отслеживания нежелательных файлов.
  6. Рассмотрели продвинутые методы и лучшие практики управления кэшем Git.

Эти навыки помогут вам поддерживать чистый и эффективный репозиторий Git, предотвращать отслеживание нежелательных файлов и защищать конфиденциальную информацию. Правильно управляя тем, какие файлы Git отслеживает, вы можете сосредоточиться на важных файлах кода и конфигурации, игнорируя временные файлы, журналы и артефакты сборки.

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