Як я можу видалити файл із сховища Git?


1922

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

Тепер поточний сховище має "file1.txt", dir1і dir2. Як я можу видалити, "file1.txt"не впливаючи на інших, як dir1і dir2?


85
git rmє правильною відповіддю, але пам’ятайте, що файл все ще буде в історії. Якщо ви хочете видалити файл, оскільки він мав конфіденційну інформацію, вам потрібно зробити щось більш різке. (Зміна історії, особливо для вмісту, який ви вже натиснули, - це кардинальне дійство, і його слід уникати, якщо можливо.)
Кіт Томпсон,

8
Примітка. На GitHub ви тепер можете безпосередньо видалити файл з веб-інтерфейсу (навіть не клонуючи репо). Дивіться мою відповідь нижче .
VonC

4
@KeithThompson, які кроки можуть бути, якщо я відчайдушно хочу це зробити?
lessthanl0l


Відповіді:


3217

Використовуйте git rm.

Якщо ви хочете видалити файл із сховища Git та файлової системи , використовуйте:

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  

91
Також зручно: каталог git rm -r // Для видалення каталогу та вмісту
Reg

10
Це не збирається позбуватися цього файлу в інших комісіях.
VaTo

6
@SaulOrtega: Це правильно. Щоб видалити файл із попередніх комісій (зміна минулої історії), див. Сторінку довідки GitHub на " Видалення конфіденційних даних" .
Грег Хьюгілл

15
Зверніть увагу, що файл також буде видалено локально. Якщо ви хочете лише видалити його з репо do do: git rm --cached file1.txt
Weston Ganger

5
Варто зазначити, що якщо цей файл містив конфіденційну інформацію (наприклад, облікові дані), ви повинні негайно змінити ці дані . Цитувати GitHub "Після того, як ви натиснули на GitHub зобов'язання, ви повинні вважати, що будь-які дані, що містяться в ньому, є компрометованими. Якщо ви ввели пароль, змініть його! Якщо ви ввели ключ, створіть новий."
c1moore

607

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

Щоб вилучити файл з репо і не видалити його з локальної файлової системи, використовуйте:
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]$

Оновлення: ця відповідь отримує деякий трафік, тому я подумав, що я згадаю, що моя інша відповідь Git ділиться кількома чудовими ресурсами: Ця сторінка містить графіку, яка допомагає демістифікувати Git для мене. Книга "Pro Git" в Інтернеті і мені дуже допомагає.


6
Тоді вам потрібно буде зробити це з чимось на зразок, git commit -m "Just removing file1.txt"а потім, якщо у вас є віддалене сховище, натисніть на комісію з чимось подібним git push origin master.
заборона-геоінженерія

77

По-перше, якщо ви використовуєте git rm, особливо для декількох файлів, вважайте, що будь-який підстановник буде вирішений оболонкою, а не gitкомандою.

git rm -- *.anExtension
git commit -m "remove multiple files"

Але якщо ваш файл уже є на GitHub, ви можете (з липня 2013 року) безпосередньо видалити його з веб-інтерфейсу!

Просто перегляньте будь-який файл у вашому сховищі, клацніть піктограму кошика у верхній частині та виконайте видалення, як і будь-яке інше веб-редагування.

Потім " git pull" на вашому локальному репо, і файл також видалить локально.
Що робить цю відповідь (круговим) способом видалення файлу з git repo?
(Не кажучи вже про те, що файл на GitHub знаходиться у "git repo")


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

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

зробити видалення

І просто так, його вже немає.

Щоб отримати допомогу в цих функціях, обов’язково прочитайте наші довідкові статті щодо створення , переміщення , перейменування та видалення файлів.

Примітка. Оскільки це система контролю версій, Git завжди має спину, якщо вам потрібно буде відновити файл пізніше.

Останнє речення означає, що видалений файл все ще є частиною історії, і ви можете відновити його досить легко (але ще не через веб-інтерфейс GitHub):

Див. " Відновлення видаленого файлу в Git repo ".


4
Вам потрібно прокрутити донизу та натиснути "Внести зміни", щоб виконати видалення!
LevinsonTechnologies

1
Це не працює для великих текстових файлів. Сервер намагається надати файл, як на скріншоті, а потім виходить з ладу з помилкою 500.
CapeCoder

9
Ця відповідь стосується github, питання про git repo. Не використовувати інтерфейс github.
Пітер Маршалл

65

Це єдиний варіант, який працював на мене.

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

Примітка. Замініть * .sql на ваше ім'я або тип файлу. Будьте дуже обережні, тому що це пройде через кожну комісію і вирве цей тип файлу.

EDIT: зверніть увагу - після цієї команди ви не зможете натиснути або потягнути - ви побачите відхилення "непов'язаної історії", ви можете використовувати "git push --force -u master master" для натискання або витягування


9
Це чудова відповідь, але зауважте, що на відміну від інших відповідей ця команда переписує історію фіксації та видаляє всі сліди файлів, що відповідають шаблону. Це особливо корисно, якщо ви виявили, що ви випадково ввели деяку конфіденційну інформацію (і, якщо потрібно, можете успішно використовувати --force, щоб переписати історію будь-яких віддалених репостів, на які було натиснуто).
yoniLavi

3
Це була саме така проблема, яку я мав, і для її виправлення потрібні були деякі спроби та помилки. Хлопець, з яким я працював, здійснив кілька великих скидів баз даних у репо, повертаючись через багато багатьох комітетів. Ось чому я використовував .sql у своєму прикладі. Мій репо настільки роздутий і великий, що github більше не сприймає натискань.
Джейсон Гліссон

3
Якщо ви використовуєте віддалений майстер, вам потрібно змусити взяти на себе зобов’язання та підштовхнути йогоgit push --force -u origin master
AlbertMarkovski

2
@AlbertMarkovski Вибачте, я не був конкретним. Github насправді не погодився б наштовхнутися, оскільки репо було понад їх розмір. Принаймні кілька ГБ. Вони відрізали мене та надіслали мені електронну пошту про це. Тож, на жаль, жодна кількість примусових натискань не допомогла б у цей момент.
Джейсон Гліссон

2
@JasonGlisson Я також стикався з тією проблемою, коли відео потрапило до сховища випадково.
AlbertMarkovski

34

Крім того, якщо папку, яку потрібно видалити, і це наступні дочірні папки або файли, використовуйте:

git rm -r foldername

2
Це видаліть папку і з локального! Use git rm --cached -r <foldername>
Вісь

24

Загалом, git helpдопоможе принаймні прості питання на кшталт цього:

zhasper@berens:/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

6
Щодо складніших речей, я вважаю git helpзаплутаним, але це добре для простих речей :)
Джеймс Поллі

9
Насправді це не так здорово для git noobs, оскільки "індекс" - це не концепція git noobs. Я говорю з особистого досвіду роботи як git noob :) Крім того, я вважаю, що набагато менш заплутано сказати, що rm ставить файл для видалення, а не видаляє з індексу (хоча для noobs це все ще безглуздо).
Роман Старков

Погоджуючись з romkyns: Опис "Видалити файли з робочого дерева та з індексу" мені не звучить так, як це спосіб видалити файл з репо. Можливо, якби я зрозумів git краще, це було б. Натомість це здається, що ви просто розпаковуєте файли (і необов’язково видаляєте їх з робочого дерева - чи це обов'язково вплине на репо?)
LarsH

14

Якщо ви хочете видалити файл з репо-репортажу, але залиште його у файловій системі (буде невизначено):

bykov@gitserver:~/temp> git rm --cached file1.txt
bykov@gitserver:~/temp> git commit -m "remove file1.txt from the repo"

Якщо ви хочете видалити файл з репо та з файлової системи, є два варіанти:

  1. Якщо у файлі немає змін, поетапних в індексі:

    bykov@gitserver:~/temp> git rm file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    
  2. Якщо у файлі є зміни, поетапні в індексі:

    bykov@gitserver:~/temp> git rm -f file1.txt
    bykov@gitserver:~/temp> git commit -m "remove file1.txt"
    

12

git rm буде видалено файл з цієї гілки лише зараз, але він залишається в історії, і git запам'ятає його.

Правильний спосіб зробити це з git filter-branch, як тут згадували інші. Він буде переписати кожен комітет в історії гілки, щоб видалити цей файл.

Але, навіть зробивши це, git може запам’ятати це, оскільки на нього можуть бути посилання в рефлогу, видаленнях, тегах тощо.

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


10

Інший спосіб, якщо ви хочете видалити файл з вашої локальної папки за допомогою команди rm, а потім натисніть зміни на віддалений сервер.

rm file1.txt

git commit -a -m "Deleting files"

git push origin master

10

Примітка. Якщо ви хочете видалити файл лише з 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

може знадобитися обстрілювати їх. Ім'я провідного каталогу (наприклад, dir для видалення 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.

- неповторно-незрівнянний

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.

Детальніше читайте на офіційному док.


7

Щоб видалити певний файл

ім'я файлу git rm

Щоб очистити всі файли, що не відслідковуються, з каталога рекурсивно за один знімок

git clean -fdx


5

Якщо у вас є програма GitHub для Windows, ви можете видалити файл у 5 простих кроків:

  • Клацніть Синхронізувати.
  • Клацніть на каталозі, де знаходиться файл, і виберіть останню версію файлу.
  • Клацніть на інструменти та виберіть "Відкрити оболонку тут".
  • В оболонці введіть: "rm {filename}" і натисніть клавішу Enter.
  • Введіть зміни та повторно синхронізуйте.

5

У моєму випадку я намагався видалити файл на github після кількох комітів, але зберегти на комп’ютері

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

і пізніше цей файл був проігнорований


3
  1. Спочатку видаліть файли з локального сховища.

    git rm -r Ім'я файлу

    або видаліть файли лише з локального сховища, але з файлової системи

    git rm - кешоване ім'я файлу

  2. По-друге, ввести зміни в локальний сховище.

    git commit -m "unwanted files or some inline comments"   
    
  3. Нарешті, оновіть / висуньте локальні зміни у віддалений сховище.

    git push 
    

це видалить усе, що стосується випадково доданого та натиснутого файла?
бапор

1

Я спробував багато запропонованих варіантів, і жоден не виявився результатом (я не перелічу різні проблеми). Що я в кінцевому підсумку робив, що працювало, було простим та інтуїтивним (для мене) було:

  1. перемістити всю місцеву репо в інше місце
  2. знову клонуйте репо з майстра на місцевий диск
  3. скопіюйте файли / папки з оригінальної копії в №1 назад у новий клон з №2
  4. переконайтесь, що проблемного великого файлу немає або виключено у файлі .gitignore
  5. виконайте звичайне додавання git / git commit / git push

1

Після того, як ви видалили файл з репо, git rmви можете використовувати BFG Repo-Cleaner для повного та легкого видалення файлу з історії репо.


0

У мене є файли obj і bin, які випадково перетворилися на репо, що я не хочу забруднювати мій список "змінених файлів"

Після того, як я помітив, що вони перейшли до пульта, я проігнорував їх, додавши це.gitignore

/*/obj
/*/bin

Проблема полягає в тому, що вони вже знаходяться у віддаленому режимі, і коли їх змінюють, вони з’являються як змінені та забруднюють список змін.

Щоб перестати їх бачити, потрібно видалити всю папку з віддаленого сховища.

У командному рядку:

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

Мені надійшло тривожне повідомлення про те, що 13 файлів змінили 315222 видалення

Потім, оскільки мені не хотілося шукати лінію CMD, я зайшов у Visual Sstudio і зробив синхронізацію, щоб застосувати його до віддаленого


0

Якщо вам потрібно видалити файли з визначеного розширення (наприклад, зібраних файлів), ви можете зробити наступне, щоб видалити їх усі відразу:

git remove -f *.pyc

0

Відповідно до документації .

git rm --cached giant_file

Що стосується конфіденційних даних - краще не кажіть, що ви видалили файл, а просто включіть його в останню відому фіксацію:

0. Змініть останнє зобов’язання

git commit --amend -CHEAD

Якщо ви хочете видалити файл із усієї історії git, згідно з документацією слід зробити наступне:

1. Видаліть його з вашої краєзнавчої історії

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \  --prune-empty --tag-name-filter cat -- --all
# Replace PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA with the path to the file you want to remove, not just its filename
  1. Не забудьте включити цей файл у .gitignore (Якщо це файл, яким ви ніколи не хочете ділитися (наприклад, паролі ...):
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"

3. Якщо вам потрібно зняти з пульта

git push origin --force --all

4. Якщо вам також потрібно видалити його з випусків тегів:

git push origin --force --tags

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.