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

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

3gp       avi       fb2       jpg       mp3       pdf      

Как удалить файл git


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

В рамках данного урока рассмотрим вопросы, касающиеся добавления, удаления и переименования файлов в 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-репозитория файлы с конфиденциальной информацией

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

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

В этой статье я расскажу о том, что делать в том случае, если в репозиторий случайно попал файл, которому там совершенно нечего делать. Здесь же я приведу команды 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

Вариант 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? — Хабр Q&A

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

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

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

Git. Как удалить удаленные файлы и папки? — Хабр Q&A

Доброго времени суток.
Есть вопрос и одновременно непоняточка небольшая.
Допустим, у меня есть репозиторий на гите.
Там сайт с системой управления.
При установке я первым делом синхронизируюсь и заливаю на гит все.
У меня там есть папка install, которая используется для установки.
После установки я удаляю папку с локалки. Но она остается в репе.
Вопрос: Надо ли её удалять? И как это сделать из консоли во время коммита?
Будет ли эта папка клонироваться, при git clone? Или будет браться моя локальная версия из последнего commit?
Вот тут не совсем улавливаю сути...

  • Вопрос задан
  • 835 просмотров

Удаление файлов из git commit

существующие ответы все говорят об удалении ненужных файлов из последние commit.

если вы хотите удалить ненужные файлы старый commit (даже нажал) и не хотите создавать новую фиксацию, которая не нужна, из-за действия:

1.

найти коммит, который вы хотите, чтобы файл, чтобы соответствовать.

git checkout <commit_id> <path_to_file> 

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

2.

git commit -am "remove unwanted files" 

3.

найти commit_id фиксации , на котором файлы были добавлены по ошибке, скажем "35c23c2" здесь

git rebase 35c23c2~1 -i // notice: "~1" is necessary 

эта команда открывает редактор в соответствии с вашими настройками. По умолчанию ВИМ.

переместите последнюю фиксацию ,которая должна быть "удалить ненужные файлы", в следующую строку неправильной фиксации ("35c23c2" в нашем случае) и установите команду как fixup:

pick 35c23c2 the first commit fixup 0d78b28 remove unwanted files 

вы должны быть хороши после сохранения файла.

закончить :

git push -f 

если вы, к сожалению, получаете конфликты, вы должны решить их вручную.

Как окончательно удалить файл, хранящийся в GIT?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

github - Как удалить файл из истории Git?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

Полностью удалить файлы из репозитория git вместе с его историей

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

Как удалить файлы из промежуточной области git?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
  5. Реклама Связаться с разработчиками
.

Как удалить файлы или папки в репозитории git с помощью Xcode?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
.

Как полностью удалить файл из репозитория Git

Введение

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

Для всех остальных: НЕ ПАНИКА! Сделайте глубокий вдох, встаньте из-за стола, пройдитесь несколько минут. Готовы? Ладно, приступим!

Цель состоит в том, чтобы полностью стереть файл из репозитория Git, чтобы скрыть все следы вашей ужасной ошибки.Вы хотите быть человеком, который передал ключи AWS в общедоступный репозиторий GitHub, только чтобы через 24 часа узнать, что ~ 2000 долларов США было потрачено на добычу биткойнов?

Несколько методов

Просто git rm passwords.txt этого не сделает, так как файл будет присутствовать во всех предыдущих коммитах. В зависимости от того, где находится файл, вы можете использовать несколько методов. Здесь представлен обзор каждого сценария в порядке возрастания сложности.

Примечания:

  • Все эти методы предполагают, что вы знакомы с консольными командами.

  • Они написаны для Linux, но должны работать в OS X и даже в Windows, если вы используете Git Bash.

  • Если вы уже внесли изменения, все может усложниться.

  • Если вы разработчик-одиночка, дерзайте. Но если вы работаете в команде, сначала обсудите это с ними.

  • Если ваш код (с ненужным файлом) уже открыт (GitHub, BitBucket ,...) тогда вам может не повезти. Но продолжайте читать до конца.

Сценарий 1: файл находится в последней фиксации, а вы еще не отправили

1. Вы хотите сохранить файл локально

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

  git rm --cached $ FILE эхо $ ФАЙЛ >> .gitignore git добавить .gitignore git commit --amend --no-edit git reflog expire --expire = now --all && git gc --prune = now --aggressive  

Команды git reflog expire и git gc вызывают сборку мусора, чтобы файл не зависал где-то в вашем репозитории.

2. Вы не хотите хранить файл локально

Просто измените последний коммит.

  git rm $ ФАЙЛ git commit --amend --no-edit git reflog expire --expire = now --all && git gc --prune = now --aggressive  

Сценарий 2: файл находится дальше в истории, и вы еще не отправили

Решение 1: BFG Repo-Cleaner

Загрузите 'BFG Repo-Cleaner' здесь. Этот инструмент утверждает, что работает в 10-720 раз быстрее, чем любой другой метод, но вы не можете указать подкаталог, он удалит все файлы с тем же именем в любом каталоге.

Обычно BFG Repo-Cleaner защищает ваш последний коммит, но если вы знаете, что делаете (и знаете, верно?), Вы даете ему опцию --no-blob-protection , что вроде как сказать , делай что хочу и не защищай меня от ошибок.

  java -jar bfg.jar --delete-files $ FILE --no-blob-protection. rm $ FILE git reflog expire --expire = now --all && git gc --prune = now --aggressive  

Решение 2: интерактивная переустановка

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

У этой команды есть подоболочка внутри $ (...) : она находит первую фиксацию, в которую был добавлен файл, даже с учетом переименований файла. Затем команда вне $ (...) запускает интерактивную перебазировку в родительском ( ~ ) этого коммита.

  git rebase --interactive \ $ (git log --follow --find-renames = 40% --diff-filter = A --format =% H - $ FILE) ~  

Отредактируйте файл git-rebase-todo : измените первую команду с выбора на редактирование.

  edit 7b0a4be987 Добавить новую таблицу тестов ширины pick 38737174a7 Избегайте использования метода FontProgram # getBaseName, когда он не подходит, обновите документацию pick 66f95dd41b Обобщить чтение байтов для преобразования формата woff # Rebase d1613dff58..66f95dd41b на d1613dff58 (3 команды) # # Команды: # p, pick = использовать фиксацию # r, reword = использовать фиксацию, но отредактировать сообщение фиксации # e, edit = использовать фиксацию, но не вносить поправки # s, squash = использовать фиксацию, но сливается с предыдущей фиксацией # f, fixup = как "squash", но удалить сообщение журнала этой фиксации # x, exec = run команда (остальная часть строки) с использованием оболочки # d, drop = удалить фиксацию # # Эти строки можно переупорядочить; они выполняются сверху вниз.# # Если вы удалите здесь строчку, ЧТО COMMIT БУДЕТ УТЕРЯНЫ. # # Однако, если вы удалите все, перебазирование будет прервано. # # Обратите внимание, что пустые коммиты закомментированы  

Затем сохраните и закройте редактор. Перебазирование откатит коммиты до коммита, добавившего нежелательный файл.

  git rm $ ФАЙЛ эхо $ ФАЙЛ >> .gitignore git добавить .gitignore git commit --amend --no-edit git rebase - продолжить git reflog expire --expire = now --all && git gc --prune = now --aggressive  

Решение 3. Git filter-branch

Это запускает сценарий, указанный в --tree-filter (f.пример: удалить определенный файл) при каждой фиксации. Это действительно МЕДЛЕННО! Это потому, что он должен проверять каждую фиксацию, запускать сценарий, выполнять фиксацию и переходить к следующей фиксации. Используйте это, когда есть теги или коммиты слияния между ошибочной фиксацией и HEAD, или когда нарушающий файл существует в нескольких ветвях. Другими словами, используйте в крайнем случае!

В этом скрипте я использую тот же трюк, чтобы найти первую фиксацию, которая добавляет ненужный файл, а затем я запускаю фильтр только для родительского элемента этой фиксации, вплоть до HEAD текущей ветки. git filer-branch всегда создает резервную копию и ставит перед исходной веткой префикс original . Команда git for-each-ref очищает эти резервные ветки, потому что мы действительно хотим избавиться от этого надоедливого файла. --tag-name-filter cat будет следить за тем, чтобы любые теги перемещались вместе с их коммитами.

  git фильтр-ветка -f \ --prune-empty \ --tag-name-filter cat \ --tree-filter 'rm -f $ FILE' \ $ (git log --follow --find-renames = 40% --diff-filter = A --format =% H - $ FILE) ~..ГОЛОВА git for-each-ref --format = "% (refname)" refs / original / | xargs -n 1 git update-ref -d git reflog expire --expire = now --all && git gc --prune = now --aggressive  

Если вы хотите сделать это для всего репозитория (не стоит!):

  git фильтр-ветка -f \ --prune-empty \ --tag-name-filter cat \ --tree-filter 'rm -f $ FILE' \ -- --все git for-each-ref --format = "% (refname)" refs / original / | xargs -n 1 git update-ref -d git reflog expire --expire = now --all && git gc --prune = now --aggressive  

Сценарий 3: вы уже отправили

  • Я не могу повторить это достаточно: сначала проконсультируйтесь с остальной частью вашей команды !!! Если вы этого не сделаете, вы сделаете их жизнь несчастной.

  • Во-вторых, сделайте резервную копию репозитория, прежде чем делать что-либо еще.

  • Затем: СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ !!!

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

  • Используйте один из описанных выше методов для удаления файла.

  • Принудительно нажмите, но знайте, что делаете, и помните о последствиях, потому что нет возможности вернуться, если у вас нет резервной копии. --force-with-lease должно быть здесь по умолчанию, потому что сначала проверяется, что вы не перезаписываете работу других людей. См. Также блог Atlassian для отличного объяснения.

      git push --force-with-lease origin $ BRANCH  

Сценарий 4: коммиты уже находятся на GitHub

В этом случае существует риск того, что кто-то все еще может получить доступ к нежелательному файлу даже после принудительной отправки.

Это можно сделать двумя способами:

  • , если они сделали форк или клон репозитория: принудительное нажатие обновит только наш репозиторий, оно не обновит форки / клоны.

  • , если им известен точный хэш коммита, добавившего файл (возможно, они его записали или веб-страница все еще находится в кеше браузера), по URL-адресу: https://github.com/$USER/ $ REPO / совершить / $ COMMIT

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

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

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

.

Смотрите также