Питання Вилучіть файл із сховища Git, не видаляючи його з локальної файлової системи


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

git rm mylogfile.log

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

Як я можу видалити цей файл із репо без Видалити мою локальну копію файлу?


2439
2017-07-17 14:56


походження


Дублікат Зупиніть відстеження та проігноруйте зміни у файлі в Git


Відповіді:


Для одного файлу:

git rm --cached mylogfile.log

Для єдиного каталогу:

git rm --cached -r mydirectory

3508
2017-07-17 14:57



Дякую! Я не знаю, як я пропустив це в людині ... "Коли видається --cached, поетапний вміст повинен збігатися або з кінцем гілки, або з файлом на диску, що дозволяє видалити файл лише з індексу " - mveerman
може бути, тому що це не так само, як пояснення --keep-local. - Martin
@ DGGenuine, --keep-local це аргумент для svn rm - bdonlan
@bdonian спасибі Повинен бути варіант до нової версії git-rm. За іронією долі ця сторінка є найвищим результатом під час кодування git rm '--keep-local' ' - Carl G
Але як я зберігаю файли на віддалених серверах? Це зберігає мій локальний, але якщо я натискаю і витягую з іншого сервера, файл буде видалено. Я також додав .gitignore для файлу, але його все ще видалити - spankmaster79


Щоб видалити всю папку з репо (наприклад, файли Resharper), виконайте наступні дії:

git rm -r --cached folderName

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


249
2018-04-04 18:14



Просто додана примітка для майбутніх відвідувачів: не використовуйте графічний інтерфейс для синхронізації, щоб повернутися до репо. Це потягне файли назад до місцевого репо. Ви повинні зробити Git Push repo branch фактично видалити файли з пульта дистанційного керування. - RubberDuck
@ RubberDuck Відповідь 3 роки, і єдине рішення, що працювало для мене :) Спасибо - Mariusz


Ви також можете видалити файли з сховища на основі вашого .gitignore, не видаляючи їх з локальної файлової системи:

git rm --cached `git ls-files -i -X .gitignore`

Або, альтернативно, на Windows PowerShell:

git rm --cached $(git ls-files -i -X .gitignore)

163
2018-01-31 10:05



Не працює на Windows. git ls-files -i -X. gitignore works, але я не знаю, як відправити файли на "git rm". Ви знаєте, як це зробити? - Erik Z
Працює на Windows, якщо ви використовуєте Git Bash замість cmd-консолі - Andreas Zita
Люблю це. Працював, за винятком того, що у мене були деякі файли, які в кінцевому підсумку мали пробіли у назві файла. Я змінив рішення тут: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". Будь ласка, подумайте про зміну чи додавання цього рішення до відповіді тут, оскільки це чудовий інструмент для ... - mpettis
Я не намагався, але його потрібно протестувати, він також видаляє файли, як .gitkeep який зберігає порожню папку в сховищі. Напр. .gitignore містити папку uploads і репо змушений стежити за цим .gitkeep. Видаляючи все з репо під uploads він також буде видалений .gitkeep. - Vladimir Vukanac
Примітка: не працює з вкладеними файлами .gitignore - acidjunk


Крім того, якщо ви налаштували конфіденційні дані (наприклад, файл із паролями), ви повинні повністю видалити його з історії сховища. Ось посібник, який пояснює, як це зробити: http://help.gityub.com/remove-sensitive-data/


66
2017-08-21 12:16



Ця відповідь повинна містити необхідні команди для виконання цього завдання, а не посилання на інший веб-сайт. - Florian Lemaitre


Відповідно до моєї відповіді тут: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Щоб видалити папку / директорію або файл лише з git repository, а не з локальної спробувати 3 простих кроки.


Кроки видалення каталогу

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

Спроби ігнорувати цю папку в наступному

Щоб ігнорувати цю папку від наступних команд, створіть один файл у кореневій назві .Гітігнорувати   і помістіть в цю папку ім'я. Ви можете розмістити стільки, скільки хочете

.Гітігнорувати файл виглядатиме так

/FolderName

remove directory


58
2017-08-24 12:16



З цікавості, як ви зробили розмивання? - kmort
@kmort Ха-ха, я зробив це, використовуючи інструмент "Чудовий знімок екрана" браузера Google Chrome, був дуже швидким, тому він виглядав брудним. Вибачте за це!! awesomescreenshot.com - eirenaios


Більш загальне рішення:

  1. Редагувати .gitignore файл

    ECHO mylogfile.log >> .gitignore

  2. Видалити всі елементи з індексу.

    git rm -r -f --cached .

  3. Відновити індекс.

    git add .

  4. Зробити нове повідомлення

    git commit -m "Removed mylogfile.log"


54
2017-12-13 11:42



Чи буде це дійсно видалити файл? - Mr_and_Mrs_D
Від GitHub? НЕМАЄ. Якщо ви вже натиснули на github, це не буде видалено з сайту. Але це оновить ваш локальний сховище git. - mAsT3RpEE
Я думаю, ви хочете цього: help.github.com/articles/remove-sensitive-data - mAsT3RpEE
Коментар, який ви видалили, насправді було усунуто насправді :) Проблема з рішенням rm --cashed це те, що в кінцевому рахунку буде видалено файл, коли один тягнеться - чи не так? І це не те, що люди хочуть, коли кажуть "Видалити файл із сховища" не видаляючи його з локальної файлової системи"Тепер чому рішення, яке прийнято вище, прийнято за мене - можливо, ОП працював самотнім і ніколи не тягнув? Не знаю, я розумію, що гітбуб" колись завжди штовхав " - Mr_and_Mrs_D
Моя проблема не є github - це таке Файл буде фактично видалено з колег, коли вони потягнуть. Я ні хочете, щоб файл було видалено. Це викликало в мене величезні проблеми в минулому. Тому мені було цікаво, чи справді існує рішення не видалити файл Див. Також коментар в приймаючої відповіді: stackoverflow.com/questions/1143796/... - Mr_and_Mrs_D


Gіt дозволяє ігнорувати ці файли, вважаючи їх незмінними. Це   виконується шляхом запуску git update-index --assume-unchanged path/to/file.txt команда Позначивши файл як такий, git буде   повністю ігнорувати будь-які зміни в цьому файлі; вони не з'являться, коли   запустіть Git статус або Git diff, і вони ніколи не будуть вчинені.

(Від https://help.github.com/articles/ignoring-files)

Отже, не видаляючи його, але ігноруючи зміни до нього назавжди. Я думаю, що це працює тільки локально, так що співробітники все ще можуть бачити зміни в ньому, якщо вони не виконують ту саму команду, що й вище. (Однак все-таки потрібно перевірити це).

Примітка. Це не відповідає на запитання безпосередньо, але грунтується на подальших питаннях у коментарях інших відповідей.


18
2018-01-28 11:46



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


Вищенаведені відповіді не працювали для мене. Я використав фільтр-гілку, щоб видалити всі виконані файли

видалити файл з сховища git з:

git filter-branch --tree-filter 'rm  file'

видалити папку з сховища git з:

git filter-branch --tree-filter 'rm -rf directory'

Це видаляє каталог або файл з усіх команд

ви можете вказати копію за допомогою:

git filter-branch --tree-filter 'rm -rf directory' HEAD

Або діапазон

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

Щоб підштовхнути все до віддаленого, ви можете зробити це:

git push origin master --force

4
2018-01-12 13:59



Це поєднується з git rm -r --cached NAME це трюк, щоб видалити його з місцевого репозитайда git і запобігти її впливу на кожного, хто тягне пізніше (видаляючи історію файлу чи каталогу з git.) - notbad.jpeg
Це переписує історію git, і вам потрібно буде натиснути --force після, це трохи поза обсягом з питанням, я думаю. На загальнодоступному відомі репо ви не можете просто змінити лінію історії так, як кожен, хто вже клонув репо, отримав б питання під час потягу. - Guillaume Perrot
Спасибі, нарешті, хтось пояснює старий старий крок за кроком без будь-яких зовнішніх інструментів - realtebo