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

Обновлено: 17.05.2024

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

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

Как я могу удалить этот файл из репозитория, не удаляя мою локальную копию файла?

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

Итак, для одного файла:

и для одного каталога:

Легко пропустить, потому что это не так само за себя, как svn rm --keep-local . Но как мне сохранить файлы на удаленных серверах? Это сохраняет мой локальный, но если я нажму и потяну с другого сервера, файл будет удален. Я также добавил .gitignore для файла, но он все еще удален Это все равно удаляет файлы, git pull если вы находитесь за коммитом после git rm Стоит отметить, что после запуска команды в ответе необходимо использовать git commit -m "Commit message" и git push . Если у вас есть какие-либо другие поэтапные изменения (проверьте с помощью git status ), они также будут зафиксированы в это время. Так как это самый приемлемый ответ и он не делает то, о чем просят, я расскажу, что я делаю. Я использую команду git rm --cached mylogfile.log и удаляю файл из репозитория. Чтобы не потерять файл в продуктивной системе, я делаю резервную копию файла и вытащу после этого. Файл будет удален, как упоминалось ранее, и его необходимо скопировать обратно из резервной копии. Это довольно больно, но я не нашел лучшего решения этой проблемы.

Чтобы удалить всю папку из репозитория (например, файлы Resharper), сделайте следующее:

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

Просто добавленная заметка для будущих посетителей: не используйте графический интерфейс для «синхронизации» фиксации обратно в репо. Это вернет файлы обратно в ваш локальный репозиторий. Вы должны сделать, Git Push repo branch чтобы фактически удалить файлы с пульта.

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

Или, в качестве альтернативы, в Windows Powershell:

Работает на Windows, если вы используете Git Bash вместо cmd-консоли Люблю это. Работал за исключением того, что у меня были некоторые файлы, которые заканчивались тем, что имели пробелы в имени файла. Я изменил решение здесь это: git ls-files -i -X .gitignore | xargs -I<> git rm --cached "<>" . Пожалуйста, подумайте об изменении или добавлении этого решения к ответу здесь, потому что это отличный инструмент для . Я не пробовал, но это должно быть проверено, удалит ли он также такие файлы, .gitkeep которые сохраняют пустую папку в хранилище. Например. .gitignore содержать папку uploads и репо вынужден отслеживать .gitkeep . Удалив все из репо под uploads него, удалят также .gitkeep . Это предложение отлично работает в powershell: git rm --cached $ (git ls-files -i -X ​​.gitignore)

Чтобы удалить папку / каталог или файл только из репозитория git, а не из локального, попробуйте 3 простых шага.

Шаги по удалению каталога

Действия по игнорированию этой папки в следующих коммитах

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

Файл .gitignore будет выглядеть так

удалить каталог

Этот ответ должен включать необходимые команды для выполнения этой задачи вместо ссылки на другой веб-сайт. Я также хотел бы отметить, что я нашел, что использовать инструмент git bfg repo cleaner проще и быстрее.

Более общее решение:

Редактировать .gitignore файл

ECHO mylogfile.log >> .gitignore

Удалить все элементы из индекса.

git rm -r -f --cached .

Сделать новый коммит

git commit -m "Removed mylogfile.log"

Из GitHub? NO. Если вы уже нажали на github, он не удалит его с сайта. Но это обновит ваш локальный репозиторий git. Комментарий, который вы удалили, был на самом деле более удален :) Проблема с решением rm --cashed состоит в том, что он в конечном итоге удалит файл, когда вы нажмете - правильно? И это не то, что люди хотят, когда говорят «Удалить файл из хранилища, не удаляя его из локальной файловой системы ». Теперь, почему принятое выше решение мне не подходит - возможно, ОП работал один и никогда не работал? Не знаю. Я понимаю, что GitHub "когда-то толкнул всегда" проблема ofc Я не думаю, что есть 100% решение, если вы не спросите сам Github. А пока придерживайтесь этого. Скопируйте файл, добавьте в gitignore, выполните git rm -r, зафиксируйте, нажмите, восстановите файл. Вам удалось найти другое решение?

Git позволяет игнорировать эти файлы, предполагая, что они не изменены. Это делается с помощью git update-index --assume-unchanged path/to/file.txt команды. После пометки файла как такового, git будет полностью игнорировать любые изменения в этом файле; они не будут отображаться при запуске git status или git diff и никогда не будут зафиксированы.

Следовательно, не удаляя это, но игнорируя изменения к этому навсегда. Я думаю, что это работает только локально, поэтому коллеги по-прежнему могут видеть изменения, если они не выполняют ту же команду, что и выше. (Тем не менее, необходимо проверить это.)

Примечание. Это не дает прямого ответа на вопрос, а основано на последующих вопросах в комментариях к другим ответам.

Рассмотрим довольно важный вопрос: как удалить коммит в git? Начнем с вопроса отмены изменений в рабочей директории, после этого перейдем к репозиторию. В рамках этой темы изучим вопросы удаления и замены последнего коммита, работу с отдельными файлами и использование команд git revert и git reset.

Отмена изменений в файлах в рабочей директории

Если вы сделали какие-то изменения в файле и хотите вернуть предыдущий вариант, то для этого следует обратиться к репозиторию и взять из него файл, с которым вы работаете. Таким образом, в вашу рабочую директорию будет скопирован файл из репозитория с заменой. Например, вы работаете с файлом main.c и внесли в него какие-то изменения. Для того чтобы вернуться к предыдущей версии (последней отправленной в репозиторий) воспользуйтесь командой git checkout.

Отмена коммитов в git

Работа с последним коммитом

Для демонстранции возможностей git создадим новый каталог и инициализируем в нем репозиторий.

Добавим в каталог файл main.c.

Отправим изменения в репозиторий.

Внесем изменения в файл.

И сделаем еще один коммит.

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

Теперь удалим последний коммит и вместо него отправим другой. Предварительно изменим содержимое файла main.c.

Отправим изменения в репозиторий с заметой последнего коммита.

Как вы можете видеть: из репозитория пропал коммит с id=d142679, вместо него теперь коммит с id=18411fd.

Отмена изменений в файле в выбранном коммите

Сделаем ещё несколько изменений в нашем файле main.c, каждое из которых будет фиксироваться коммитом в репозиторий.

Для просмотра содержимого файла в коммите с id=18411fd воспользуемся правилами работы с tree-ish (об этом подробно написано здесь)

Переместим в рабочую директорию файл main.c из репозитория с коммитом id=18411fd.

Таким образом мы вернулись к предыдущей версии файла main.c и при этом сохранили всю историю изменений.

Использование git revert для быстрой отмены изменений

Рассмотрим ещё одни способ отмены коммитов, на этот раз воспользуемся командой git revert.

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

Обратите внимание, что в этом случае будут изменены настройки для текущего репозитория. Более подробно об изменении настроек смотрите в “Git для начинающих. Часть 3. Настройка Git”

Проверим, применялась ли настройка.

Посмотрим на список коммитов в репозитории.

Содержимое файла вернулось к тому, что было сделано в рамках коммита с >

Отмена группы коммитов

ВНИМАНИЕ! Используйте эту команду очень аккуратно!

Содержимое файла main.с в рабочей директории.

Содержимое файла main.с в репозитории.

Теперь переместим HEAD в репозитории на коммит с id=dcf7253.

Получим следующий список коммитов.

Содержимое файла main.c в репозитории выглядит так.

В рабочей директории файл main.c остался прежним (эти изменения отправлены в stage).

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

Посмотрим на список коммитов.

Как видите из репозитория пропали следующие коммиты:

В результате изменилось содержимое репозитория.

Содержимое файла main.c в последнем коммите выглядит так.

Файл main.c в рабочей директории не изменился.

Отправим изменения вначале в stage, а потом в репозиторий.

Текущее содержимое репозитория выглядит так.

Посмотрим на содержимое файла main.c в каталоге и репозитории.

Содержимое файлов идентично.

Удалим все коммиты до самого первого с id=86f1495.

Состояние рабочей директории и stage.

Содержимое файла main.c в репозитории и в рабочей директории.

БУДЬТЕ ОЧЕНЬ АККУРАТНЫ С ЭТОЙ КОМАНДОЙ!

Git для начинающих. Часть 9. Как удалить коммит в git? : 2 комментария

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

Эта команда перезаписывает последний коммит (т.е. последний удаляется и на его место встает новый), файл в исходное состояние не возвращается.

А в какой задаче это может быть полезно?

Я зафиксировал и отправил какой-то каталог на github. После этого я изменил файл .gitignore , добавив каталог, который следует игнорировать. Все работает нормально, но каталог (теперь игнорируемый) остается на github.

Как мне удалить этот каталог из github и истории репозитория?

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

Кроме того, обратите внимание, что вывод из git rm -r --cached some-directory будет примерно таким:

rm - это отзыв git о репозитории; файлы все еще находятся в рабочем каталоге.

Который удалит все файлы /папки, которые в вашем git игнорируются, за исключением того, что вы должны выбрать каждый из них вручную

Это, похоже, перестало работать на меня, теперь я так и делаю:

Чтобы удалить папку /каталог только из репозитория git, а не из локального, попробуйте 3 простых шага.

Действия по удалению каталога

Действия по игнорированию этой папки в следующих коммитах

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

.gitignore будет выглядеть так

удалить каталог

Первый ответ Бланделла мне не помог. Однако это показало мне правильный путь. Я сделал то же самое, как это:

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

Я использовал файл .gitignore по умолчанию для Visual Studio и заметил, что он удаляет все папки журналов и бинов в проекте, что не было моим намерением.

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

Примечание. Это решение работает только с графическим интерфейсом Github Desktop .

Временно переместите папку в другое место (из папки проекта).

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

Примите и синхронизируйте папку проекта.

Переместите папку в папку проекта

Повторно отредактируйте файл .gitignore .

Если вы работаете с PowerShell, попробуйте выполнить следующую команду одной командой.

Я добавил файл с именем "file1.txt" в репозиторий Git. После этого я зафиксировал его, добавил пару каталогов с именем dir1 and dir2 и отправил их в репозиторий Git.

Теперь текущее хранилище имеет "file1.txt" , dir1 и dir2 . Как я могу удалить, "file1.txt" не влияя на других, как dir1 и dir2 ?

git rm это правильный ответ, но помните, что файл все еще будет там в истории. Если вы хотите удалить файл, потому что он содержал конфиденциальную информацию, вам нужно сделать что-то более радикальное. (Изменение истории, особенно для контента, который вы уже добавили, является радикальным действием, и его следует избегать, если это возможно.) Примечание: в GitHub вы теперь можете напрямую удалить файл из веб-интерфейса (даже не клонируя репо). Смотрите мой ответ ниже . @KeithThompson, что это может быть, если я отчаянно хочу это сделать?

Если вы хотите удалить файл из репозитория Git и файловой системы , используйте:

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

И подтолкнуть изменения к удаленному репо

Также удобно: git rm -r directory // Удалить каталог и контент Это не собирается избавляться от этого файла в других коммитах. Обратите внимание, что файл будет удален и локально. Если вы хотите удалить его только из репозитория, выполните: git rm --cached file1.txt Стоит отметить, что если этот файл содержит конфиденциальную информацию (например, учетные данные), вы должны немедленно изменить эти учетные данные . Процитируем GitHub: «После того, как вы отправили коммит в GitHub, вы должны рассматривать любые содержащиеся в нем данные как скомпрометированные. Если вы зафиксировали пароль, измените его! Если вы зафиксировали ключ, сгенерируйте новый».

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

Чтобы удалить файл из репозитория и не удалять его из локальной файловой системы, используйте:
git rm --cached file.txt

Ниже приведена точная ситуация, когда я использую git для поддержки контроля версий для веб-сайта моего бизнеса, но каталог «mickey» был папкой tmp для обмена частным контентом с разработчиком САПР. Когда он нуждался в ОГРОМНЫХ файлах, я создал личный, несвязанный каталог и установил там ftpd файлы для его загрузки через браузер. Забыв, что я сделал это, я позже выполнил git add -A из базовой директории сайта. Впоследствии git status показали новые файлы, требующие фиксации. Теперь мне нужно было удалить их из отслеживания git и контроля версий .

Ниже приведен пример того, что случилось со мной, когда я случайно удалил .003 файл. К счастью, мне все равно, что случилось с локальной копией .003 , но некоторые другие в настоящее время измененные файлы были обновлениями, которые я только что сделал на веб-сайте, и они были бы грандиозными, если их удалить в локальной файловой системе! «Локальная файловая система» = живой сайт (не очень хорошая практика, но реальность) .

Обновление: Этот ответ получает некоторый трафик, поэтому я подумал, что упомяну другой мой ответ Git, делится парой отличных ресурсов: На этой странице есть рисунок, который помогает демистифицировать Git для меня. Книга "Pro Git" онлайн и мне очень помогает.

Затем вам нужно будет зафиксировать это с помощью чего-то подобного, git commit -m "Just removing file1.txt" а затем, если у вас есть удаленный репозиторий, протолкнуть коммит с чем-то вроде git push origin master .

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

Но, если ваш файл уже находится на GitHub, вы можете (с июля 2013 года) напрямую удалить его из веб-интерфейса!

Просто просмотрите любой файл в вашем хранилище, щелкните значок корзины в верхней части и подтвердите удаление, как и любое другое редактирование через Интернет.

Затем " git pull " в вашем локальном репо, и это также приведет к удалению файла локально.
Что делает этот ответ (окольным) способом удаления файла из git repo?
(Не говоря уже о том, что файл на GitHub находится в «git repo»)

кнопка удаления

(фиксация будет отражать удаление этого файла):

совершить удаление

И просто так, это ушло.

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

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

Последнее предложение означает, что удаленный файл все еще является частью истории, и вы можете восстановить его достаточно легко (но пока не через веб-интерфейс GitHub):

Читайте также: