.gitignore и "Следующие неотслеживаемые файлы рабочего дерева будут перезаписаны извлечением" - PullRequest
768 голосов
/ 01 февраля 2011

Итак, я добавил папку в свой файл .gitignore.

Как только я делаю git status, он говорит мне

# On branch latest
nothing to commit (working directory clean)

Однако, когда я пытаюсь сменить ветки, я получаюследующее:

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

Вот так выглядит мой файл .gitignore:

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

Как мне заставить это работать, чтобы я мог переключать ветви, не удаляя эти файлы?

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

Я не хочу терять эти файлы, я просто не хочу, чтобы они отслеживались.

Ответы [ 28 ]

966 голосов
/ 03 декабря 2011

ВНИМАНИЕ: он удалит неотслеживаемые файлы, поэтому это не очень хороший ответ на поставленный вопрос.

Я также попал в это сообщение.В моем случае я не хотел сохранять файлы, поэтому у меня это работало:

git 2.11 и новее

git clean  -d  -f .

старше git

git clean  -d  -f ""

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

ВНИМАНИЕ !!!ЭТО НАИБОЛЕЕ ВЕРОЯТНО УНИЧТОЖАЕТ ВАШ ПРОЕКТ, ИСПОЛЬЗУЙТЕ ТОЛЬКО, ЕСЛИ ВЫ ЗНАЕТЕ 100% ЧТО ВЫ ДЕЛАЕТЕ

GIT 2.11 и новее

git clean  -d  -fx .

старше GIT

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x означает, что игнорируемые файлы также удаляются, а также файлы, неизвестные git.

  • -d означает удаление неотслеживаемых каталогов вдополнение к неотслеживаемым файлам.

  • -f требуется, чтобы заставить его работать.

540 голосов
/ 11 января 2013

Предупреждение. Это приведет к удалению локальных файлов, которые не проиндексированы

Просто принудительно введите: git checkout -f another-branch

246 голосов
/ 01 февраля 2011

Кажется, вы хотите, чтобы файлы игнорировались, но они уже были зафиксированы. .gitignore не влияет на файлы, которые уже находятся в репо, поэтому их необходимо удалить с помощью git rm --cached. --cached предотвратит какое-либо влияние на вашу рабочую копию и просто пометит как удаленный при следующей фиксации. После удаления файлов из репозитория .gitignore предотвратит их повторное добавление.

Но у вас есть другая проблема с вашим .gitignore, вы чрезмерно используете подстановочные знаки, и это приводит к тому, что он соответствует меньше, чем вы ожидаете. Вместо этого давайте изменим .gitignore и попробуем это.

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/
135 голосов
/ 30 мая 2014

Если вы работаете в OS X, это может быть из-за того, что в имени файла есть определенные символы для изменения регистра. Попробуйте установить следующий параметр конфигурации:

git config core.ignorecase true
42 голосов
/ 01 февраля 2011

Git сообщает вам, что хочет создать файлы (с именем public/system/images/9/... и т. Д.), Но у вас уже есть файлы в этом каталоге, которые не отслеживаются в Git. Возможно, кто-то еще добавил эти файлы в репозиторий Git, и вы впервые переключаетесь на эту ветку?

Возможно, причина в том, что эти файлы в вашей develop ветке, но не в вашей текущей. Возможно, вам придется спросить ваших сотрудников, почему это так.

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

Вы не можете сделать это, не заставив файлы исчезнуть как-то. Вы можете переименовать public в my_public или что-то еще.

если бы я потом вернулся в эту ветку, все было бы идеально, как до моего последнего коммита?

Если вы передадите свои изменения, Git не потеряет их. Если вы не фиксируете свои изменения, то Git будет очень стараться , а не , чтобы перезаписать работу, которую вы сделали. Это то, о чем Git предупреждает вас в первую очередь здесь (когда вы пытались переключать ветки).

23 голосов
/ 08 января 2018

Это сработало для меня.

 1. git fetch --all
 2. git reset --hard origin/{branch_name}
21 голосов
/ 21 сентября 2016

Для этой деликатной задачи есть команда (окончательно удаляющая неотслеживаемые файлы)

git clean -i

Тогда git pull сделает.

12 голосов
/ 09 января 2013

К сожалению, ни git rm --cached, ни git clean -d -fx "" не сделали это для меня.

Мое решение закончилось тем, что я перенес мою ветку на удаленный сервер, клонировал новое репо и затем произвел слияние с новым репо. Другие люди, имеющие доступ к репо, должны были сделать то же самое.

Мораль истории: используйте файл .gitignore с самого начала.

11 голосов
/ 14 февраля 2018

Для тех, кому нужно что-то менее далеко идущее, чем Скотт Шефер ответ ,

git clean -f

скорее всего будет работать. Я высоко предлагаю запустить

git clean --dry-run

первый. Эта команда выведет список файлов, которые Git удалит, если вы запустите git clean -f, и может избавить вас от необходимости непреднамеренного удаления того, что вы не хотели.

См. этот ответ Oveflow стека или документы для получения дополнительной информации о git clean.

9 голосов
/ 24 июня 2016

Если вы хотите быстро решить этот вопрос, вы можете использовать эту команду:

git checkout -f dev
...