it-swarm.com.ru

Как я могу удалить файл из git repo?

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

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

1537
webminal.org

Используйте git rm :

git rm file1.txt
git commit -m "remove file1.txt"

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

git rm --cached file1.txt
git commit -m "remove file1.txt"

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

git Push Origin branch_name  
2587
Greg Hewgill

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

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

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

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

[~/www]$ git rm shop/mickey/mtt_flange_SCN.7z.003
error: 'shop/mickey/mtt_flange_SCN.7z.003' has local modifications
(use --cached to keep the file, or -f to force removal)
[~/www]$ git rm -f shop/mickey/mtt_flange_SCN.7z.003
rm 'shop/mickey/mtt_flange_SCN.7z.003'
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
#   modified:   shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git rm --cached shop/mickey/mtt_flange_SCN.7z.002
rm 'shop/mickey/mtt_flange_SCN.7z.002'
[~/www]$ ls shop/mickey/mtt_flange_S*
shop/mickey/mtt_flange_SCN.7z.001  shop/mickey/mtt_flange_SCN.7z.002
[~/www]$ 
[~/www]$ 
[~/www]$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   deleted:    shop/mickey/mtt_flange_SCN.7z.002
#   deleted:    shop/mickey/mtt_flange_SCN.7z.003
#
# Changed but not updated:
#   modified:   shop/mickey/mtt_flange_SCN.7z.001
[~/www]$

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

567
Chris K

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

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

delete button

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

commit a deletion

И вот так, это ушло.

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

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

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

Смотрите " Восстановить удаленный файл в Git-репо ".

63
VonC

Это единственный вариант, который работал для меня.

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch *.sql'

Примечание. Замените * .sql именем файла или типом файла. Будьте очень осторожны, потому что это пройдет каждый коммит и вырвет этот тип файла. 

Правка: Обратите внимание - после этой команды вы не сможете нажимать или тянуть - вы увидите отклонение «несвязанной истории», которую вы можете использовать «git Push --force -u Origin master», чтобы толкать или тянуть

47
Jason Glisson

Кроме того, если это папка, которую нужно удалить, и последующие дочерние папки или файлы, используйте:

git rm -r foldername
32
Raja

В целом, git help поможет, по крайней мере, с такими простыми вопросами, как этот:

[email protected]:/media/Kindle/documents$ git help
usage: git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path] [-p|--paginate|--no-pager] [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE] [--help] COMMAND [ARGS]

The most commonly used git commands are:
   add        Add file contents to the index
   :
   rm         Remove files from the working tree and from the index
23
James Polley

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

[email protected]:~/temp> git rm --cached file1.txt
[email protected]:~/temp> git commit -m "remove file1.txt from the repo"

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

  1. Если в файле нет изменений, внесенных в указатель: 

    [email protected]:~/temp> git rm file1.txt
    [email protected]:~/temp> git commit -m "remove file1.txt"
    
  2. Если в файле есть изменения, внесенные в указатель: 

    [email protected]:~/temp> git rm -f file1.txt
    [email protected]:~/temp> git commit -m "remove file1.txt"
    
15
Aleksey Bykov

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

Правильный способ сделать это с git filter-branch, как уже упоминали другие. Он будет перезаписывать каждый коммит в истории ветки, чтобы удалить этот файл.

Но даже после этого git может запомнить его, потому что на него могут быть ссылки в reflog, remotes, tags и т.д.

Если вы хотите полностью стереть его за один шаг, я рекомендую вам использовать git forget-blob

https://ownyourbits.com/2017/01/18/completely-remove-a-file-from-a-git-repository-with-git-forget-blob/

Это просто, просто сделайте git forget-blob file1.txt.

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

12
nachoparker

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

rm file1.txt

git commit -a -m "Deleting files"

git Push Origin master
9
Suhaib

Чтобы удалить определенный файл

имя файла git rm

Очистить все неотслеживаемые файлы из каталога за один раз

git clean -fdx

7
Sitesh

Если у вас есть приложение GitHub для Windows, вы можете удалить файл за 5 простых шагов:

  • Нажмите Синхронизировать.
  • Нажмите на каталог, в котором находится файл, и выберите свою последнюю версию файла.
  • Нажмите на инструменты и выберите «Открыть оболочку здесь».
  • В командной консоли введите: «rm {filename}» и нажмите ввод.
  • Зафиксируйте изменения и выполните повторную синхронизацию.
5
jushusted

В моем случае я попытался удалить файл на GitHub после нескольких коммитов, но сохранить на компьютере

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch file_name_with_path' HEAD
git Push --force -u Origin master

а позже этот файл был проигнорирован

5
OlegV

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

git rm --cached file1.txt

Если вы хотите удалить также с жесткого диска:

git rm file1.txt

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

git rm -r foldername

Если вы хотите удалить папку внутри другой папки

git rm -r parentFolder/childFolder

Затем вы можете commit и Push как обычно. Однако, если вы хотите восстановить удаленную папку, вы можете выполнить следующее: возможно восстановление удаленных файлов из git.

Из документа:

git rm [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>…​

ОПЦИИ

<file>…​

Files to remove. Fileglobs (e.g. *.c) can be given to remove all matching files. If you want Git to expand file glob characters, you

может понадобиться Shell-избежать их. Для удаления всех файлов в .__ можно указать начальное имя каталога (например, dir для Remove dir/file1 и dir/file2). каталог и рекурсивно все подкаталоги, но для этого требуется опция -r должна быть явно указана . -f--force

Override the up-to-date check.

-n--dry-run

Don’t actually remove any file(s). Instead, just show if they exist in the index and would otherwise be removed by the command.

-r

Allow recursive removal when a leading directory name is given.

-- 

This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken for

параметры командной строки) . --cached

Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

--ignore-unmatch

Exit with a zero status even if no files matched.

-q--quiet

git rm normally outputs one line (in the form of an rm command) for each file removed. This option suppresses that output.

Подробнее на официальном док.

3
Blasanka
  1. Сначала удалите файлы из локального хранилища.

    git rm -r File-Name

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

    git rm - кэшированное имя файла

  2. Во-вторых, зафиксировать изменения в локальном хранилище.

    git commit -m "unwanted files or some inline comments"   
    
  3. Наконец, обновите/отправьте локальные изменения в удаленный репозиторий.

    git Push 
    
3
Ajay

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

  1. переместить весь локальный репо в другое место
  2. снова клонируйте репо с мастера на локальный диск
  3. скопируйте обратно файлы/папки из вашей оригинальной копии в # 1 обратно в новый клон из # 2
  4. убедитесь, что файл большой проблемы либо отсутствует, либо исключен из файла .gitignore
  5. сделать обычный git add/git commit/git Push
2
jacanterbury

После того, как вы удалили файл из репозитория с помощью git rm, вы можете использовать BFG Repo-Cleaner , чтобы полностью и легко стереть файл из истории репо.

0
glisu

У меня есть файлы obj и bin, которые случайно попали в репозиторий, который я не хочу загрязнять в списке «измененных файлов»

После Я заметил, что они пошли на пульт, я проигнорировал их, добавив это в .gitignore

/*/obj
/*/bin

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

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

В командной строке:

  1. CD в ​​папку репо (т.е. C:\repos\MyRepo)
  2. Я хочу удалить SSIS\obj. Кажется, вы можете удалить только на верхнем уровне, поэтому теперь вам нужно записать CD в SSIS: (т.е. C:\repos\MyRepo\SSIS
  3. Теперь введите магическое заклинание git rm -r -f obj
    • гт = удалить
    • -r = рекурсивно удалить
    • -f = означает силу, потому что вы действительно это имеете в виду
    • obj это папка
  4. Теперь запустите git commit -m "remove obj folder"

Я получил тревожное сообщение о том, что 13 файлов изменено 315222 удалений

Тогда, потому что я не хотел искать строку CMD, я вошел в Visual Sstudio и сделал синхронизацию, чтобы применить ее к удаленному

0
Nick.McDermaid