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

вопрос создан в Fri, Jul 3, 2015 12:00 AM

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

git rm mylogfile.log

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

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

    
2761
  1. 2014-05-24 23: 21: 52Z
  2. Стоит отметить, что ответ с наибольшим количеством голосов опасен для некоторых. Если вы используете удаленное репо, чем когда вы нажимаете локально, извлеките в другое место те файлы, которые вы удалили из git только БУДЕТ УДАЛЕНО . Это упоминается в одном из ответов, но не комментируется.
    2018-08-24 04: 17: 11Z
9 ответов                              9                         

Из файла man:

  

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

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

git rm --cached mylogfile.log

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

git rm --cached -r mydirectory
    
3962
2019-03-23 ​​00: 43: 50Z
  1. Легко пропустить, потому что он не так понятен, как svn rm --keep-local.
    2011-06-24 11: 44: 31Z
  2. Но как мне сохранить файлы на удаленных серверах? Это сохраняет мой локальный, но если я нажму и потяну с другого сервера, файл будет удален. Я также добавил .gitignore для файла, но он все равно будет удален
    2013-02-22 15: 44: 02Z
  3. Это все равно удаляет файлы git pull, если вы находитесь за коммитом после git rm
    2014-05-22 17: 02: 12Z
  4. Стоит отметить, что после выполнения команды в ответе необходимо использовать git commit -m "Commit message" и git push. Если у вас есть какие-либо другие поэтапные изменения (проверьте с помощью git status), они будут также быть совершенным в это время.
    2017-09-11 20: 29: 32Z
  5. Так как это наиболее приемлемый ответ и он не выполняет то, о чем просят, я расскажу, что я делаю. Я использую команду git rm --cached mylogfile.log и удаляю файл из хранилища. Чтобы не потерять файл в продуктивной системе, я делаю резервную копию файла и вытащу после этого. Файл будет удален, как упоминалось ранее, и его необходимо скопировать обратно из резервной копии. Это довольно болезненно, но я не нашел лучшего решения этой проблемы.
    2017-12-14 18: 37: 06Z

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

git rm -r --cached folderName

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

    
262
2012-10-02 09: 25: 13Z
  1. Просто добавленная заметка для будущих посетителей: не используйте графический интерфейс для «синхронизации» фиксации обратно в репозиторий. Это вернет файлы обратно в ваш локальный репозиторий. Вы должны сделать Git Push repo branch, чтобы фактически удалить файлы с пульта.
    2014-12-04 04: 24: 11Z

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

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

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

git rm --cached $(git ls-files -i -X .gitignore)
    
185
2017-12-06 17: 42: 47Z
  1. Не работает в Windows. git ls-files -i -X ​​.gitignore работает, но я не знаю, как отправить файлы в 'git rm'. Ты знаешь, как это сделать?
    2014-05-09 06: 04: 06Z
  2. Работает в Windows, если вы используете Git Bash вместо cmd-console
    2014-12-16 18: 12: 34Z
  3. Люблю это. Работал за исключением того, что у меня были некоторые файлы, которые в конечном итоге имели пробелы в имени файла. Я изменил решение здесь так: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". Пожалуйста, рассмотрите возможность изменения или добавления этого решения в ответ здесь, потому что это отличный инструмент для ...
    2016-03-12 17: 48: 55Z
  4. Я не пробовал, но его следует протестировать, удалит ли он также файлы, такие как .gitkeep, которые сохраняют пустую папку в хранилище. Например. .gitignore содержит папку uploads, и репо вынуждено отслеживать .gitkeep. При удалении всех репо из uploads также удаляются также .gitkeep.
    2016-07-07 09: 11: 48Z
  5. Примечание: не работает с вложенными файлами .gitignore
    2017-11-13 07: 23: 25Z

Согласно моему ответу здесь: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory -в-мой-GitHub-хранилище

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

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

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

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

  

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

Файл

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

/FolderName

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

    
75
2017-09-04 04: 55: 24Z
  1. работает безупречно!
    2019-06-08 12: 54: 11Z
  2. @ gaurav рад, что это помогло!
    2019-06-18 08: 12: 09Z

Кроме того, если вы передали конфиденциальные данные (например, файл, содержащий пароли), вы должны полностью удалить их из истории репозитория. Вот руководство, объясняющее, как это сделать: http://help.github.com/remove-sensitive-data/ р>     

67
2011-08-21 12: 16: 36Z
  1. Этот ответ должен включать необходимые команды для выполнения этой задачи вместо ссылки на другой веб-сайт.
    2018-02-02 13: 08: 33Z
  2. Я также хотел бы отметить, что я нашел с помощью инструмент для очистки репозитория git bfg проще и быстрее.
    2019-02-14 22: 52: 54Z

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

  1. Отредактируйте файл .gitignore.

    ECHO mylogfile.log >> .gitignore р>

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

    git rm -r -f --cached . р>

  3. Перестроить индекс.

    git add . р>

  4. Создать новый коммит

    git commit -m "Removed mylogfile.log" р>

59
2013-12-13 11: 42: 32Z
  1. Это фактически удалит файл?
    2013-12-13 15: 39: 10Z
  2. Из GitHub? NO. Если вы уже нажали на github, он не удалит его с сайта. Но это обновит ваш локальный репозиторий git.
    2013-12-14 12: 37: 52Z
  3. Я думаю, вы хотите этого: help.github.com/articles/remove-sensitive-data
    2013-12-14 12: 38: 22Z
  4. Удаленный комментарий был на самом деле более исключен :) Проблема с решением rm --cashed заключается в том, что в конечном итоге файл будет удален при нажатии - верно? И это не то, что люди хотят, когда говорят «Удалить файл из хранилища , не удаляя его из локальной файловой системы ». Теперь, почему принятое выше решение мне не подходит - возможно, ОП работал один и никогда не работал? Не знаю. Я понимаю, что GitHub "когда-то толкнул всегда" вопрос о
    2013-12-14 12: 42: 56Z
  5. Моя проблема не в github, а в том, что файл будет фактически удален из коллег при извлечении . Я не хочу, чтобы файл был удален. Это вызвало у меня огромные проблемы в прошлом. Поэтому мне было интересно, есть ли действительно решение, которое действительно не удаляет файл. См. Также комментарий в принятом ответе: stackoverflow.com/questions/1143796/…
    2013-12-14 13: 07: 46Z
  

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

(из https://help.github.com/articles/ignoring-files )

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

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

    
21
2014-01-28 11: 46: 49Z
  1. Хм, я делаю это, но вижу, что файл может быть перезаписан, если кто-то еще внесет в него изменения в репо.
    2014-09-15 16: 50: 07Z

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

git update-index --assume-unchanged  file_name_with_path
    
9
2018-09-07 09: 05: 22Z

Приведенные выше ответы не сработали для меня. Я использовал filter-branch, чтобы удалить все зафиксированные файлы.

Удалите файл из репозитория 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
    
6
2019-02-20 03: 48: 36Z
  1. Это в сочетании с git rm -r --cached NAME - это хитрость, позволяющая удалить его из локального репозитория git и предотвратить его влияние на любого, кто потянет позже (удалив историю файла или каталога из git ).
    2016-03-17 20: 15: 52Z
  2. Это переписывает историю git, и после этого вам нужно будет нажать --force, это немного выходит за рамки вопроса, который я полагаю. В общедоступном репо вы не можете просто изменить историю, так как у всех, кто уже клонировал репо, возникнут проблемы при извлечении.
    2017-04-01 01: 37: 02Z
источник размещен Вот
Другие вопросы