Каталог расширений

Популярные теги

3gp       avi       fb2       jpg       mp3       pdf      

Как удалить файл из репозитория github


Добавление, удаление и переименование файлов в репозитории

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

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

Добавление файлов в репозиторий – это достаточно простая операция, мало чем отличающаяся от отправки изменений в отслеживаемых файлах в репозиторий. Мы уже не раз выполняли эту операцию в предыдущих уроках, но сделаем это ещё раз. Создадим новый репозиторий, для этого перейдите в каталог, в котором вы хотите его расположить и введите команду git init.

> git init
 

Создайте в каталоге файл README.md любым удобным для вас способом, мы сделаем это с помощью команды touch.

> touch README.md
 

Теперь проверим состояние отслеживаемой директории.

> git status
 On branch master
 
 Initial commit
 
 Untracked files:
 (use "git add <file>..." to include in what will be committed)
 
 README.md
 
 nothing added to commit but untracked files present (use "git add" to track)
 

Как вы можете видеть: в рабочей директории есть один неотслеживаемый файл README.md. Git нам подсказывает, что нужно сделать для того, чтобы начать отслеживать изменения в файле README.md: необходимо выполнить команду git add, сделаем это.

> git add README.md
 

Посмотрим ещё раз на состояние.

> git status
 On branch master
 
 Initial commit
 
 Changes to be committed:
 (use "git rm --cached <file>..." to unstage)
 
 new file: README.md
 

Видно, что информация о появлении нового файла попала в stage. Для того чтобы это изменение зафиксировалось в репозитории необходимо выполнить команду git commit.

> git commit -m "add README.md file"
 [master (root-commit) 0bb6c94] add README.md file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md
 

Теперь в рабочей директории и в stage нет объектов, информацию об изменении которых необходимо внести в репозиторий.

> git status
 On branch master
 nothing to commit, working tree clean
 

В репозиторий был сделан один коммит.

> git log --oneline
 0bb6c94 add README.md file
 

Удаление файлов из git репозитория и из stage

Удаление файла из stage

Вначале разберемся со stage. Создадим ещё один файл.

> touch main.c
 

“Отправим” файл main.c в stage.

> git add main.c
 

Внесем изменения в README.md.

> echo "# README" > README.md
 

Информацию об этом также отправим в stage.

> git add README.md
 

Посмотрим на состояние stage.

> git status
 On branch master
 Changes to be committed:
 (use "git reset HEAD <file>..." to unstage)
 
 modified: README.md
 new file: main.c
 

Если нам необходимо убрать из stage, какой-то из этих файлов (main.c или README.md), то для этого можно воспользоваться командой git –rm cashed <filename>, сделаем это для файла main.c.

> git rm --cached main.c
 rm 'main.c'
 

Теперь посмотрим на состояние рабочей директории и stage.

> git status
 On branch master
 Changes to be committed:
 (use "git reset HEAD <file>..." to unstage)
 
 modified: README.md
 
 Untracked files:
 (use "git add <file>..." to include in what will be committed)
 
 main.c
 

Видно, что изменения в файле README.md готовы для коммита, а вот файл main.c перешел в состояние – неотслеживаемый. Отправим main.c в stage и, после этого, сделаем коммит в репозиторий.

> git add main.c
 > git commit -m "add main.c and do some changes in README.md"
 [master 49049bc] add main.c and do some changes in README.md
 2 files changed, 1 insertion(+)
 create mode 100644 main.c
 

Удаление файлов из git репозитория

Удалить файл из репозитория можно двумя способами: первый – удалить его из рабочей директории и уведомить об этом git; второй – воспользоваться средствами git. Начнем с первого способа. Для начала посмотрим, какие файлы у нас хранятся в репозитории.

> git ls-tree master
 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c
 

Удалим файл main.c из рабочей директории.

> rm main.c
 > ls
 README.md
 

Уведомим об этом систему git.

> git rm main.c
 rm 'main.c'
 

Вместо команды git rm можно использовать git add, но само слово add в данном случае будет звучать несколько неоднозначно, поэтому лучше использовать rm. На данном этапе еще можно вернуть все назад с помощью команды git checkout — <filename>, в результате, в нашу рабочую директорию будет скопирован файл из репозитория. Создадим коммит, фиксирующий удаление файла.

> git commit -m "remove main.c"
 [master d4e22ae] remove main.c
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 main.c
 

Теперь в репозитории остался только один файл README.md.

> git ls-tree master
 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
 

Второй способ – это сразу использовать команду git rm без предварительного удаления файла из директории. Вновь создадим файл main.c и добавим его в репозиторий.

> touch main.c
 > git add main.c
 > git commit -m "add main.c file"
 [master 6d93049] add main.c file
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 main.c
 > git ls-tree master
 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c
 

Удалим файл из репозитория.

> git rm main.c
 rm 'main.c'
 
 > git commit -m "deleted: main.c file"
 [master ba7d027] deleted: main.c file
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 main.c
 

Файла main.c больше нет в репозитории.

> git ls-tree master
 100644 blob 7e59600739c96546163833214c36459e324bad0a README.md
 

Его также нет и в рабочем каталоге.

> ls
 README.md
 

Удалите файл README.md из репозитория самостоятельно.

Переименование файлов в git репозитории

Как и в случае с удалением, переименовать файл в git репозитории можно двумя способами – с использованием и без использования средств операционной системы.

Первый способ. Создадим файл test_main_file.c и добавим его в репозиторий.

> touch test_main_file.c
 
 > git add test_main_file.c
 
 > git commit -m "add test_main_file.c"
 [master 6cf53ac] add test_main_file.c
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test_main_file.c
 

Содержимое репозитория после этого будет выглядеть так.

> git ls-tree master
 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test_main_file.c
 

Переименуем его на test_main.c.

Сделаем это в рабочей директории.

> mv test_main_file.c test_main.c
 

Теперь отправим изменение в репозиторий.

> git add .
 > git commit -m "Rename test_main_file.c"
 [master 79528c4] Rename test_main_file.c
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename test_main_file.c => test_main.c (100%)
 

В репозитории и в рабочей директории будет находится только файл test_main.c.

> git ls-tree master
 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test_main.c
 
 > ls
 test_main.c
 

Второй способ.

В рамках второго способа рассмотрим работу с командой git mv. Переименуем файл test_main.c в main.c. Текущее содержимое репозитория и рабочего каталога.

> git ls-tree master
 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test_main.c
 > ls
 test_main.c
 

Переименуем файл test_main.c на main.c средствами git.

> git mv test_main.c main.c
 
 > git commit -m "Rename test_main.c file"
 [master c566f0e] Rename test_main.c file
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename test_main.c => main.c (100%)
 

Имя файла изменилось как в репозитории так и в рабочем каталоге.

> git ls-tree master
 100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 main.c
 
 > ls
 main.c
 

Отличный курс по git  делают ребята из GeekBrains, найдите в разделе “Курсы” курс “Git. Быстрый старт”, он бесплатный!

<<<Часть 7. Поговорим о HEAD и tree-ish   Часть 9. Как удалить коммит в git?>>>

Как удалить лишние папки и файлы из git репозитория? — Хабр Q&A

Вариант 1 (история изменений, добавлений файлов в папках останется):
  1. Удалить локально, закомитить
  2. Добавить названия папок в .gitignore
  3. git push

Вариант 2 (история история будет полностью перезаписана, изменений, добавлений файлов в папках не будет):
Это вариант следует согласовывать, если с репозиторием работает больше одного разработчика.

  1. git obliterate <путь_папки>(https://github.com/tj/git-extras)
  2. git push --force

После этой операции другим участникам, надо будет локально сбросить ветки:
git fetch git checkout master git reset --hard origin/master

Аналог команды git obliterate исключительно средствами Git:

git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch -r <путь_папки>' \ --prune-empty --tag-name-filter cat -- --all

Как убрать из Git-репозитория файлы с конфиденциальной информацией

Файлы проиндексированы, написано сообщение коммита, данные отправлены на сервер… И вдруг хочется повернуть время вспять. В коммит попал файл, которого там быть не должно. Когда такое случается, приходит время обращаться к поисковику.

Каждый разработчик когда-то по ошибке коммитил в общедоступный репозиторий файлы с конфиденциальной информацией. Как справиться с такой проблемой? Как сделать так, чтобы ничего подобного больше не случилось бы?

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


Удаление файлов с конфиденциальной информацией из Git-репозитория (изображение большого размера)

Минимизация ущерба


Итак, вы случайно закоммитили файл с конфиденциальной информацией. Назовём этот файл .env. Сразу после того, как это случилось, надо задать себе пару вопросов:
  • Отправлен ли коммит в удалённый репозиторий?
  • Является ли удалённый репозиторий общедоступным?

▍Коммит пока не отправлен в удалённый репозиторий


Если вы пока не отправили коммит в репозиторий, то, в общем-то, возникшая ситуация никакой угрозы не несёт. Для того чтобы всё исправить, достаточно просто вернуться к предыдущему коммиту:
git reset HEAD^ --soft 

Файлы останутся в рабочей копии репозитория, вы сможете внести в проект необходимые изменения.

Если же вы хотите сохранить коммит и вам нужно просто удалить из него определённые файлы, тогда поступите так:

git rm .env --cached git commit --amend 

Параметр --amend можно использовать только для работы с самым свежим коммитом. Если вы, после неудачного коммита, добавили ещё несколько, воспользуйтесь такой командой:
git rebase -i HEAD~{на сколько коммитов нужно вернуться?} 

Это позволит исправить неправильный коммит и поможет не потерять изменения, внесённые в проект остальными коммитами.

▍Коммит отправлен в удалённый репозиторий


Если вы уже отправили коммит в удалённый репозиторий, то, в первую очередь, вам нужно знать о том, чем отличаются публичные и приватные репозитории.

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

Если вы отправили в репозиторий, после проблемного коммита, и другие коммиты, это не помешает вам убрать файлы с конфиденциальными данными из истории Git, воспользовавшись командой git filter-branch или инструментом BFG Repo-Cleaner.

Вот пример использования git filter-branch:

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch .env" --prune-empty --tag-name-filter cat -- --all 

Но, делая это, учитывайте два важных аспекта подобных изменений, вносимых в репозиторий:
  • Вы меняете историю Git. Если на текущее состояние репозитория полагаются другие люди, если от этого состояния зависят какие-то ветки того же репозитория, его форки, открытые PR, то это нарушит их работу. В подобных случаях относитесь к репозиторию как к общедоступному и постарайтесь не вносить изменения в его историю.
  • Вам нужно будет очистить кеш. Вам понадобится обратиться в службу поддержки платформы, на которой хранится ваш репозиторий, и попросить очистить его кеш. Несмотря на то, что вы исправили проблемный коммит или переписали историю репозитория, старый коммит, содержащий конфиденциальные данные, останется в кеше. Для того чтобы к нему обратиться, нужно будет знать его ID, но к нему можно будет получить доступ до тех пор, пока кеш не очистят.

Нужно ли создавать новые секретные ключи в том случае, если их актуальные версии попали в публичный репозиторий?


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

Даже если вы удалили эти данные из репозитория, вы ничего не сможете сделать с ботами и с форками репозитория. Как же поступить?

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

Рекомендации по хранению конфиденциальных файлов в проектах, в которых для контроля версий применяется Git


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

▍Храните секретные данные в файле .env (или в другом подобном файле)


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

Ещё одно преимущество такого подхода заключается в том, что так у вас будет доступ ко всем ключам через глобальную переменную process.

▍Используйте, если это возможно, ключи API


Скомпрометированные ключи API легко деактивировать, такие ключи легко создать заново. Если это возможно — используйте именно их, а не нечто вроде логинов и паролей.

▍Храните ключи API, пользуясь средствами вашего инструмента для сборки проектов


Ключи API обычно нужны при сборке приложений. Инструменты для сборки проектов, вроде Netlify, позволяют держать ключи в защищённых хранилищах. Такие ключи автоматически внедряются в приложение с использованием глобальной переменной process.
Управление переменными окружения

▍Добавьте запись о файле .env в файл .gitignore


Сделайте так, чтобы Git не отслеживал бы файлы, содержащие конфиденциальную информацию.

▍Подготовьте шаблонный файл .env.template


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

▍Не меняйте историю Git в удалённых репозиториях


Постарайтесь строго придерживаться этого правила. Если вы следовали вышеприведённым рекомендациям, то историю Git вам менять и не потребуется.

Итоги


Надеюсь, мой материал поможет вам в безопасной работе с конфиденциальными данными.

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

Удаление файлов из репозитория Git? — Хабр Q&A

Имеется следующая проблема. Гуглёж особо ни к чему ни привел.

Есть develop и production репозитории git, а между ними bare репозиторий. Рабочая копия приложения содержит гораздо больше файлов, чем нужно хранить в репозитории. При этом в репозитории заведомо присутствуют лишние для него файлы, которые в процессе работы нужно находить и удалять из репозитория (но не из рабочей копии). Казалось бы, нужно использовать git rm --cached для удаления файлов из под контроля, добавление их в gitignore и все.
Если на dev репозитории выполнить git rm --cached, то файлы действительно удалятся из индекса, при этом останутся в локальной рабочей копии. Однако после отправки их в bare репозиторий и при последующем pull на production (или любом другом репозитории) эти файлы, если они присутствовали, будут удалены как из репозитория, так и из рабочей копии.

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

Git. Удалить файл из репозитория » PacificSky.Ru


Если вы сделали commit и push файла в ветку, но потом поняли, что файл не должен был попасть в репозиторий, то в целом можно подумать, что если добавить файл в .gitignore, то файл перестанет индексироваться и git перестанет отслеживать в нем изменения.
Но это не совсем так. По сути файл будет точно так же отслеживаться.

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

  1. Добавить файл в .gitignore
  2. git rm --cached --ignore-unmatch index.php - Удалить файл index.php из репозитория (Физически файл будет храниться на диске)
  3. git commit -am "Сообщение коммита" - Создание коммита который будет автоматически индексировать каждый, уже отслеживаемый, на момент коммита файл, позволяя вам обойтись без git add
  4. git push origin [Название ветки] - Push изменений на сервер

Удалить файл из репозитория Git, не удаляя его из локальной файловой системы

моя первоначальная фиксация содержала некоторые файлы журнала. Я добавил *log мой .gitignore и теперь я хочу удалить файлы журнала из моего репозитория.

git rm mylogfile.log 

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

Как удалить этот файл из РЕПО без удаление моей локальной копии файла?

2499