Как удалить файл из репозитория github
Этот вопрос был перенесен из Stack Exchange для веб-мастеров, поскольку на него можно ответить в Exchange Stack Exchange. Мигрировал 7 лет назад .
Определенно есть способ редактировать файлы, но я не уверен, что есть способ их удалить. В любом случае, вы можете хотеть команды независимо. Обучение git в терминале или через графический интерфейс принесет дивиденды.
Это актуальный вопрос, даже для опытных пользователей Git. Я использую git из командной строки, но я просто разветвил репо, сделал быстрое изменение, и теперь я хотел бы удалить файл, который больше не нужен, без необходимости клонировать репо на моем собственном компьютере.
Я добавил решение, которое, хотя и не напрямую из GitHub (это с prose.io), удалит все файлы и в результате также удалит папку, поскольку она пуста. Это делается с помощью скрипта, поэтому нет необходимости вручную удалять несколько файлов.
Я обнаружил, что удаление всех файлов в папке автоматически удалит папку. Не идеальное решение, но, похоже, задумано.
У вас есть несколько вариантов:
- Удалите все файлы из этой папки, и Github удалит папку автоматически.
- Клонируйте репозиторий на локальном компьютере и удалите папку (для этого вы можете использовать либо git bash / cmd в зависимости от вашей системы, либо приложение github для настольного компьютера, если оно установлено в вашей системе), и синхронизировать его с сервером.
Вы не указали свои точные обстоятельства, поэтому этот ответ может быть не тем, что вы хотите, но если вы используете Windows, вы можете установить Github для Windows , что позволяет вам выполнять все обычные операции Git без командной строки.
Сначала вам нужно проверить репо в папке, удалить файл из папки (т. Е. В проводнике Windows), затем зафиксировать свои изменения и выполнить синхронизацию с репозиторием Github.
Это нормально, но ОП на самом деле не указал, в чем заключалась его проблема, только в том, что ему не нравится командная строка. Точно так же, как на вопросы «как анализировать HTML с помощью регулярных выражений» на SO отвечает «решить вашу проблему по-другому», мой ответ - альтернативный метод, на случайный случай решающий любую проблему, которая у него есть. Очевидно, вы можете предложить лучший ответ, если таковой имеется.
Нет, он не Название здесь - это вопрос, а не проблема. Многие люди задают вопрос, который, по их мнению, решит их проблему, но есть лучший способ решить проблему. Это может или не может иметь место здесь, нам придется ждать, пока ФП ответит.
Рассмотрим довольно важный вопрос: как удалить коммит в git? Начнем с вопроса отмены изменений в рабочей директории, после этого перейдем к репозиторию. В рамках этой темы изучим вопросы удаления и замены последнего коммита, работу с отдельными файлами и использование команд git revert и git reset.
Отмена изменений в файлах в рабочей директории
Если вы сделали какие-то изменения в файле и хотите вернуть предыдущий вариант, то для этого следует обратиться к репозиторию и взять из него файл, с которым вы работаете. Таким образом, в вашу рабочую директорию будет скопирован файл из репозитория с заменой. Например, вы работаете с файлом main.c и внесли в него какие-то изменения. Для того чтобы вернуться к предыдущей версии (последней отправленной в репозиторий) воспользуйтесь командой git checkout.
Ключ “- -” означает, что нас интересует файл в текущем бранче (ветке).
Отмена коммитов в git
Работа с последним коммитом
Для демонстранции возможностей git создадим новый каталог и инициализируем в нем репозиторий.
Добавим в каталог файл main.c.
Отправим изменения в репозиторий.
Внесем изменения в файл.
И сделаем еще один коммит.
В репозиторий, на данный момент, было сделано два коммита.
Теперь удалим последний коммит и вместо него отправим другой. Предварительно изменим содержимое файла main.c.
Отправим изменения в репозиторий с заметой последнего коммита.
Как вы можете видеть: из репозитория пропал коммит с id=d142679, вместо него теперь коммит с id=18411fd.
Отмена изменений в файле в выбранном коммите
Сделаем ещё несколько изменений в нашем файле main.c, каждое из которых будет фиксироваться коммитом в репозиторий.
Представим ситуацию, что два последних коммита были неправильными, и нам нужно вернуться к версии 18411fd и внести изменения именно в нее. В нашем примере, мы работаем только с одним файлом, но в реальном проекте файлов будет много, и после коммитов, в рамках которых вы внесли изменения в интересующий вас файл, может быть ещё довольно много коммитов, фиксирующих изменения в других файлах. Просто так взять и удалить коммиты из середины ветки не получится – это нарушит связность, что идет в разрез с идеологией git. Одни из возможных вариантов – это получить версию файла из нужного нам коммита, внести в него изменения и сделать новый коммит. Для начала посмотрим на содержимое файла main.c из последнего, на текущий момент, коммита.
Для просмотра содержимого файла в коммите с id=18411fd воспользуемся правилами работы с tree-ish (об этом подробно написано здесь)
Переместим в рабочую директорию файл main.c из репозитория с коммитом id=18411fd.
Таким образом мы вернулись к предыдущей версии файла main.c и при этом сохранили всю историю изменений.
Использование git revert для быстрой отмены изменений
Рассмотрим ещё одни способ отмены коммитов, на этот раз воспользуемся командой git revert.
Если вы хотите поменять редактор, то воспользуйтесь командой.
Обратите внимание, что в этом случае будут изменены настройки для текущего репозитория. Более подробно об изменении настроек смотрите в “Git для начинающих. Часть 3. Настройка Git”
Проверим, применялась ли настройка.
Посмотрим на список коммитов в репозитории.
Содержимое файла вернулось к тому, что было сделано в рамках коммита с >
Отмена группы коммитов
ВНИМАНИЕ! Используйте эту команду очень аккуратно!
Если вы не знакомы с концепцией указателя HEAD, то обязательно прочитайте статью “ Git для начинающих. Часть 7. Поговорим о HEAD и tree-ish“. HEAD указывает на коммит в репозитории, с которого будет вестись дальнейшая запись, т.е. на родителя следующего коммита. Существует три опции, которые можно использовать с командой git reset для изменения положения HEAD и управления состоянием stage и рабочей директории, сейчас мы все это подробно разберем.
Удаление коммитов из репозитория (без изменения рабочей директории) (ключ –soft)
Для изменения положения указателя HEAD в репозитории, без оказания влияния рабочую директорию (в stage, при этом, будет зафиксированно отличие рабочей директории от репозитория), используйте ключ –soft. Посмотрим ещё раз на наш репозиторий.
Содержимое файла main.с в рабочей директории.
Содержимое файла main.с в репозитории.
Теперь переместим HEAD в репозитории на коммит с id=dcf7253.
Получим следующий список коммитов.
Содержимое файла main.c в репозитории выглядит так.
В рабочей директории файл main.c остался прежним (эти изменения отправлены в stage).
Для того, чтобы зафиксировать в репозитории последнее состояние файла main.c сделаем коммит.
Посмотрим на список коммитов.
Как видите из репозитория пропали следующие коммиты:
Удаление коммитов из репозитория и очистка stage (без изменения рабочей директории) (ключ –mixed)
Если использовать команду git reset с аргументом –mixed, то в репозитории указатель HEAD переместится на нужный коммит, а также будет сброшено содержимое stage. Отменим последний коммит.
В результате изменилось содержимое репозитория.
Содержимое файла main.c в последнем коммите выглядит так.
Файл main.c в рабочей директории не изменился.
Отправим изменения вначале в stage, а потом в репозиторий.
Удаление коммитов из репозитория, очистка stage и внесение изменений в рабочую директорию (ключ –hard)
Если вы воспользуетесь ключем –hard, то обратного пути уже не будет. Вы не сможете восстановить данные из рабочей директории. Все компоненты git (репозиторий, stage и рабочая директория) будут приведены к одному виду в соответствии с коммитом, на который будет перенесен указатель HEAD.
Текущее содержимое репозитория выглядит так.
Посмотрим на содержимое файла main.c в каталоге и репозитории.
Содержимое файлов идентично.
Удалим все коммиты до самого первого с id=86f1495.
Состояние рабочей директории и stage.
Содержимое файла main.c в репозитории и в рабочей директории.
Т.к. мы воспользовались командой git reset с ключем –hard, то восстановить прежнее состояние нам не получится.
БУДЬТЕ ОЧЕНЬ АККУРАТНЫ С ЭТОЙ КОМАНДОЙ!
Отличный курс по git делают ребята из GeekBrains , найдите в разделе “Курсы” курс “Git. Быстрый старт” , он бесплатный!
Git для начинающих. Часть 9. Как удалить коммит в git? : 2 комментария
Работа с последним коммитом:
git commit –amend -m “third commit”
Это отменяет последний коммит, но не возвращает файл в исходное состояние.
А в какой задаче это может быть полезно?
Эта команда перезаписывает последний коммит (т.е. последний удаляется и на его место встает новый), файл в исходное состояние не возвращается.
А в какой задаче это может быть полезно?
хм… хороший вопрос! Даже затрудняюсь на него ответить. Ну например, вы закоммитили какой-то “ужас” и не хотите, чтобы он стал достоянием общественности))
В рамках данного урока рассмотрим вопросы, касающиеся добавления, удаления и переименования файлов в git репозитории.
Добавление файлов в git репозиторий
Добавление файлов в репозиторий – это достаточно простая операция, мало чем отличающаяся от отправки изменений в отслеживаемых файлах в репозиторий. Мы уже не раз выполняли эту операцию в предыдущих уроках, но сделаем это ещё раз. Создадим новый репозиторий, для этого перейдите в каталог, в котором вы хотите его расположить и введите команду git init .
Создайте в каталоге файл README.md любым удобным для вас способом, мы сделаем это с помощью команды touch .
Теперь проверим состояние отслеживаемой директории.
Как вы можете видеть: в рабочей директории есть один неотслеживаемый файл README.md . Git нам подсказывает, что нужно сделать для того, чтобы начать отслеживать изменения в файле README.md : необходимо выполнить команду git add , сделаем это.
Посмотрим ещё раз на состояние.
Видно, что информация о появлении нового файла попала в stage . Для того чтобы это изменение зафиксировалось в репозитории необходимо выполнить команду git commit .
Теперь в рабочей директории и в stage нет объектов, информацию об изменении которых необходимо внести в репозиторий.
В репозиторий был сделан один коммит.
Удаление файлов из git репозитория и из stage
Удаление файла из stage
Вначале разберемся со stage . Создадим ещё один файл.
“Отправим” файл main.c в stage .
Внесем изменения в README.md .
Информацию об этом также отправим в stage .
Посмотрим на состояние stage .
Если нам необходимо убрать из stage , какой-то из этих файлов (main.c или README.md), то для этого можно воспользоваться командой git –rm cashed , сделаем это для файла main.c .
Теперь посмотрим на состояние рабочей директории и stage .
Видно, что изменения в файле README.md готовы для коммита, а вот файл main.c перешел в состояние – неотслеживаемый. Отправим main.c в stage и, после этого, сделаем коммит в репозиторий.
Удаление файлов из git репозитория
Удалить файл из репозитория можно двумя способами: первый – удалить его из рабочей директории и уведомить об этом git ; второй – воспользоваться средствами git . Начнем с первого способа. Для начала посмотрим, какие файлы у нас хранятся в репозитории.
Удалим файл main.c из рабочей директории.
Уведомим об этом систему git .
Вместо команды git rm можно использовать git add , но само слово add в данном случае будет звучать несколько неоднозначно, поэтому лучше использовать rm . На данном этапе еще можно вернуть все назад с помощью команды git checkout — , в результате, в нашу рабочую директорию будет скопирован файл из репозитория. Создадим коммит, фиксирующий удаление файла.
Теперь в репозитории остался только один файл README.md .
Второй способ – это сразу использовать команду git rm без предварительного удаления файла из директории. Вновь создадим файл main.c и добавим его в репозиторий.
Удалим файл из репозитория.
Файла main.c больше нет в репозитории.
Его также нет и в рабочем каталоге.
Удалите файл README.md из репозитория самостоятельно.
Переименование файлов в git репозитории
Как и в случае с удалением, переименовать файл в git репозитории можно двумя способами – с использованием и без использования средств операционной системы.
Первый способ. Создадим файл test_main_file.c и добавим его в репозиторий.
Содержимое репозитория после этого будет выглядеть так.
Переименуем его на test_main.c .
Сделаем это в рабочей директории.
Теперь отправим изменение в репозиторий.
В репозитории и в рабочей директории будет находится только файл test_main.c .
Второй способ.
В рамках второго способа рассмотрим работу с командой git mv . Переименуем файл test_main.c в main.c . Текущее содержимое репозитория и рабочего каталога.
Переименуем файл test_main.c на main.c средствами git .
Имя файла изменилось как в репозитории так и в рабочем каталоге.
Отличный курс по git делают ребята из GeekBrains , найдите в разделе “Курсы” курс “Git. Быстрый старт” , он бесплатный!
Git для начинающих. Часть 8. Добавление, удаление и переименование файлов в репозитории : 1 комментарий
В целом, очень неплохо написанный начальный курс. Что бросилось в глаза, так это то, что вы вводите такую конструкцию как
без объяснений, что это значит и чем отличается от простого git rm. Между тем это достаточно важный и не слишком очевидный момент (cached, staged). Я не искал по всем частям опубликованного вами материала. Возможно, есть и другие подобные места, требующие чуть более основательных пояснений. Я понимаю, что в короткую статью очень сложно втиснуть все нужное, не раздувая ее до объема книги, но тем не менее.
I have added a file named "file1.txt" to a Git repository. After that, I committed it, added a couple of directories called dir1 and dir2 , and committed them to the Git repository.
Now the current repository has "file1.txt" , dir1 , and dir2 . How can I delete "file1.txt" without affecting others, like dir1 and dir2 ?
git rm is the right answer, but remember that the file will still be there in history. If you want to remove a file because it had sensitive information, you'll need to do something more drastic. (Changing history, especially for content you've already pushed, is a drastic action, and should be avoided if possible.)
Note: on GitHub, you now can directly delete a file from the web interface (without having to even clone the repo). See my answer below.
24 Answers 24
If you want to remove the file from the Git repository and the filesystem, use:
But if you want to remove the file only from the Git repository and not remove it from the filesystem, use:
And to push changes to remote repo
@SaulOrtega: That's correct. To remove a file from previous commits (changing past history), see GitHub's help page on Remove sensitive data.
Take note this will delete the file locally too. If you only want to delete it from the repo do: git rm --cached file1.txt
It's worth noting that if that file contained sensitive information (e.g. credentials) you should change those credentials immediately. To quote GitHub "Once you have pushed a commit to GitHub, you should consider any data it contains to be compromised. If you committed a password, change it! If you committed a key, generate a new one."
git rm file.txt removes the file from the repo but also deletes it from the local file system.
To remove the file from the repo and not delete it from the local file system use:
git rm --cached file.txt
The below exact situation is where I use git to maintain version control for my business's website, but the "mickey" directory was a tmp folder to share private content with a CAD developer. When he needed HUGE files, I made a private, unlinked directory and ftpd the files there for him to fetch via browser. Forgetting I did this, I later performed a git add -A from the website's base directory. Subsequently, git status showed the new files needing committing. Now I needed to delete them from git's tracking and version control.
Sample output below is from what just happened to me, where I unintentionally deleted the .003 file. Thankfully, I don't care what happened to the local copy to .003 , but some of the other currently changed files were updates I just made to the website and would be epic to have been deleted on the local file system! "Local file system" = the live website (not a great practice, but is reality).
Update: This answer is getting some traffic, so I thought I'd mention my other Git answer shares a couple of great resources: This page has a graphic that help demystify Git for me. The "Pro Git" book is online and helps me a lot.
Мой первоначальный коммит содержал несколько файлов журнала. Я добавил *log в свой .gitignore , и теперь я хочу удалить файлы журнала из моего хранилища.
удалит файл из хранилища, но также удалит его из локальной файловой системы.
Как я могу удалить этот файл из репозитория, не удаляя мою локальную копию файла?
Когда --cached задано, поэтапное содержимое должно соответствовать либо концу ветви, либо файлу на диске, что позволяет удалить файл только из индекса.
Итак, для одного файла:
и для одного каталога:
Но как мне сохранить файлы на удаленных серверах? Это сохраняет мой локальный, но если я нажму и потяну с другого сервера, файл будет удален. Я также добавил .gitignore для файла, но он все еще удален
Стоит отметить, что после запуска команды в ответе необходимо использовать git commit -m "Commit message" и git push . Если у вас есть какие-либо другие поэтапные изменения (проверьте с помощью git status ), они также будут зафиксированы в это время.
Так как это самый приемлемый ответ и он не делает то, о чем просят, я расскажу, что я делаю. Я использую команду git rm --cached mylogfile.log и удаляю файл из репозитория. Чтобы не потерять файл в продуктивной системе, я делаю резервную копию файла и вытащу после этого. Файл будет удален, как упоминалось ранее, и его необходимо скопировать обратно из резервной копии. Это довольно больно, но я не нашел лучшего решения этой проблемы.
Чтобы удалить всю папку из репозитория (например, файлы Resharper), сделайте следующее:
Я зафиксировал некоторые файлы для изменения резкости и не хотел, чтобы они сохранялись для других пользователей проекта.
Просто добавленная заметка для будущих посетителей: не используйте графический интерфейс для «синхронизации» фиксации обратно в репо. Это вернет файлы обратно в ваш локальный репозиторий. Вы должны сделать, Git Push repo branch чтобы фактически удалить файлы с пульта.
Вы также можете удалить файлы из хранилища на основе вашего .gitignore, не удаляя их из локальной файловой системы:
Или, в качестве альтернативы, в Windows Powershell:
Люблю это. Работал за исключением того, что у меня были некоторые файлы, которые заканчивались тем, что имели пробелы в имени файла. Я изменил решение здесь это: git ls-files -i -X .gitignore | xargs -I<> git rm --cached "<>" . Пожалуйста, подумайте об изменении или добавлении этого решения к ответу здесь, потому что это отличный инструмент для .
Я не пробовал, но это должно быть проверено, удалит ли он также такие файлы, .gitkeep которые сохраняют пустую папку в хранилище. Например. .gitignore содержать папку uploads и репо вынужден отслеживать .gitkeep . Удалив все из репо под uploads него, удалят также .gitkeep .
Чтобы удалить папку / каталог или файл только из репозитория 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 и никогда не будут зафиксированы.
Следовательно, не удаляя это, но игнорируя изменения к этому навсегда. Я думаю, что это работает только локально, поэтому коллеги по-прежнему могут видеть изменения, если они не выполняют ту же команду, что и выше. (Тем не менее, необходимо проверить это.)
Примечание. Это не дает прямого ответа на вопрос, а основано на последующих вопросах в комментариях к другим ответам.
Читайте также: