.gitignore и «Следующие неотслеживаемые файлы рабочего дерева будут перезаписаны извлечением»


829

Поэтому я добавил папку в мой файл .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/*

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

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

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


10
если вы действительно не заботитесь об этих файлах: git checkout -f <branch> в моем случае файлы создаются в процессе сборки, так что мне все равно
Hobbamok

Иногда случается, если вы делаете 'git checkout' (без имени ветки). Для того, чтобы исправить, сделать «мерзавец контроль branchname»
крафтером

Отдельный, но критически связанный вопрос: почему эта ошибка возникает вообще? почему нельзя просто переключаться между ветками?
Анбизкад

@ahnbizcad Потому что, если вы работали над новым файлом, и кто-то в другой ветке зафиксировал файл с тем же именем, вы были бы взбешены, если бы git уничтожил вашу версию, когда вы переключали ветки. Вот почему флаг -f есть.
Мэтью Шарп

Ответы:


264

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

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

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

2
Спасибо .... Я удалил все файлы из текущей ветки и сделал их резервную копию. Затем поменял ветки и поставил их обратно. Это сработало. Кроме того, спасибо за подсказку .gitignore, хотя
marcamillion

@marcamillion: Что вы подразумеваете под «это сработало»? Если файлы отслеживались в ветви, на которую вы переключились, вы перезаписали их своими версиями, которые могут отличаться ...
Cascabel

1
У меня возникла проблема с папкой / build, которую не нужно отслеживать. Поэтому я удалил локальную папку, зафиксировал мой файл .gitignore, затем извлек другую ветку. Это, наконец, сработало для меня.
Майк С.

16
Я думаю, что первая часть для обратного этого конкретного сообщения об ошибке. Эта ошибка говорит о том, что пользователь в данный момент находится в ветке, в которой не отслеживаются эти файлы JPG, и пользователь пытается перейти к той, которая делает это. Таким образом, git rm --cachedэто не будет иметь значения, эти файлы не существуют в текущей ветви. Для этой ошибки я думаю, что вместо этого пользователь должен следовать ответу @Greg Hewgill - «убрать их из рабочей копии, переключить ветви и переместить их назад».
Studgeek

5
Как можно было бы решить your files would be overwrittenс, fatal: pathspec 'test/node_modules' did not match any filesкогда я делаю git rm -r --cache test/node_modules? Я не могу вытащить из-за перезаписанного сообщения и не могу удалить, потому что git не может их найти (они есть)
HMR

1049

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

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

мерзавец 2.11 и новее

git clean  -d  -f .

старый мерзавец

git clean  -d  -f ""

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

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

мерзавец 2.11 и новее

git clean  -d  -fx .

старый мерзавец

git clean  -d  -fx ""

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

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

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

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


7
Спасибо, после этой чистки я смог сделать ребазинг;
Александр Белецкий

139
БУДЬТЕ ОСТОРОЖНЫ, КОГДА РАБОТАЕТ!
Ноэль

249
Чтобы избежать использования лицевого пальца, сначала запустите его с опцией пробного запуска, чтобы посмотреть, что он будет делать: git clean -dfxnилиgit clean -dfx --dry-run
Деннис

74
Святое дерьмо. Это удаляет все файлы конфигурации на моем xcode, и теперь проект превращается в проект Mac. БУДЬТЕ ОЧЕНЬ ОСТОРОЖНЫ, ЧТОБЫ ВЫПОЛНИТЬ ЭТУ КОМАНДУ Я думал, что это только удалит это из мерзавца.
tyegah123

25
-xВариант мне больно
Wener

590

Предупреждение: это удалит локальные файлы, которые не проиндексированы

Просто заставьте это: git checkout -f another-branch


78
Предупреждение: это удалит локальные файлы, которые не проиндексированы.
Givanse

Git Clean не работал для меня, но сила была именно то, что мне было нужно. Он застрял в той ветке, и мне просто нужно было поменять ветки.
Simon The Cat

7
Я не хотел файл, который не был проиндексирован! +1 для вас
ryansstack

я получил эту ошибку ,,, :(error: pathspec 'mybranch' did not match any file(s) known to git.
Буди Мулё

2
Это настоящий ответ.
metamonkey

147

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

git config core.ignorecase true

13
Это работало и на Windows, похоже, что эта ситуация произошла в первую очередь из-за изменения дела, которое GIT не смог определить
SagiLow

4
Это как раз та проблема, которая у меня была, путь к файлу отличался на одну букву - Windows воспринимает это как то же самое, но GIT этого не делает.
Даниэль Соколовский

1
Моя проблема произошла при оформлении
Weijie Sun

классно! это исправило мою проблему, когда я перемещался между тегами
Уильям Аньес

1
Это работает также, если вы пытаетесь git rebaseтак же. Спасибо.
user3890355

42

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

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

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

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

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

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


Спасибо за объяснение. Я сделал резервную копию файлов, переключил ветви и объединил их, а затем заменил файлы в общей папке. Это сработало.
Marcamillion

1
Как я прокомментировал ответ @ Arrowmaster. Это правильный ответ для сообщения об ошибке. Это может быть неправильный ответ для этого конкретного спрашивающего, так как его настоящие проблемы, похоже, его gitignore.
Studgeek

38

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

 1. git fetch --all
 2. git reset --hard origin/{branch_name}

5
Пожалуйста, добавьте объяснение вашего решения. см. stackoverflow.com/help/how-to-answer
user7294900

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

2
По некоторым причинам, это единственное рабочее решение для меня. Спасибо друг.
Кивад

Решил мою проблему. Спасибо
Деваши Кант

Большое спасибо, так просто! git reset - Происхождение / разработка. Как я ненавижу редактирование этих конфликтов слияния. Эта команда такая милая и простая.
9-9

22

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

git clean -i

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


13

Для тех, кому нужно что-то менее серьезное, чем ответ Скотта Шейфера ,

git clean -f

скорее всего сработает. Я настоятельно рекомендую бежать

git clean --dry-run

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

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


12

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

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

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


10

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

git checkout -f dev

Это помогло мне, когда моя проблема не была связана с .gitignoreafaik.
Накилон

ошибка: pathspec 'dev' не соответствует ни одному из файлов, известных git.
Черный

@ Черное «dev» - это название филиала, вместо этого поместите свою ветку
Vinit Solanki

8

Это случилось со мной в системе Windows 8 , используя Git из командной строки. Остальная часть моей команды использует TFS , и я использую git-tf от Microsoft для передачи / извлечения между TFS и моим локальным Git-репозиторием.

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

  • Файлы были отмечены смешанным регистром в их именах.
  • В последующем коммите имена файлов были изменены на все строчные.
  • git-tf изначально получил файлы в смешанном регистре.
  • Когда файлы были переименованы в нижний регистр, git-tf не получил файлы, потому что для Windows 8 эти имена файлов эквивалентны.
  • Поскольку Git чувствителен к регистру, он жаловался на то, что у меня были файлы со смешанным регистром, которых не было в системе контроля версий. Но, используя git status, я не увидел никаких изменений, так как в командной строке Windows эти имена файлов эквивалентны.

Самым простым решением для меня было:

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

+1 Я смог использовать git log в текущей ветви и ветви, чтобы перебазировать, чтобы увидеть, когда произошла фиксация, которая изменила регистр; тогда я взломал это ...
мудрец

8

У меня была такая же проблема при проверке ветки на основе более раннего коммита. Git отказался оформить заказ из-за неотслеживаемых файлов.

Я нашел решение и надеюсь, оно вам тоже поможет.

Добавление затронутых каталогов .gitignoreи выдача $ git rm -r --cachedна них, по-видимому, недостаточно.

Предположим, вы хотите создать ветку на основе более раннего коммита K, чтобы протестировать некоторые вещи и вернуться к текущей версии. Я бы сделал это в следующих шагах:

  1. Настройте неотслеживаемые файлы: отредактируйте .gitignoreи примените $ git rm -r --cachedк файлам и каталогам, которые Git должен игнорировать. Добавить также файл .gitignoreсам в .gitignoreи не забудьте вопрос$ git rm -r --cached .gitignore . Это гарантирует, что поведение игнорирования git оставляет то же самое в предыдущих коммитах.

  2. Передайте изменения, которые вы только что сделали:

    $ git add -A
    $ git commit
    
  3. Сохраните текущий журнал, иначе у вас могут возникнуть проблемы с возвратом к текущей версии

    $ git log > ../git.log

  4. Хард ресет к коммиту K

    $ git reset --hard version_k

  5. Создать ветку на основе коммита K

    $ git branch commit_k_branch

  6. Оформить заказ в эту ветку

    $ git checkout commit_k_branch

  7. Делай свои вещи и совершай это

  8. Оформить заказ снова в мастер

    $ git checkout master

  9. Сброс к текущей версии снова

    $ git reset current_version или $ git reset ORIG_HEAD

  10. Теперь вы можете сбросить жесткий в ГОЛОВУ

    git reset --hard HEAD

НОТА! Не пропускайте предпоследний шаг (например, например $ git reset --hard ORIG_HEAD ), иначе не отслеживаемые файлы, о которых говорилось выше, будет потеряна.

Я также удостоверился, что файлы, на которые жаловался git, не были удалены. Я скопировал их в текстовый файл и выдал команду$ for i in $(cat ../test.txt); do ls -ahl $i; done

Если вы снова вернетесь к упомянутой выше ветке, не забудьте выполнить выдачу, $ git statusчтобы избежать появления нежелательных изменений.


4

В моем случае проблема была с подмодулями. masterбыл объединен с другой веткой, которая добавила новый субмодуль в проект. В ветке, которую я пытался оформить, его не было, поэтому git жаловался на неотслеживаемые файлы, и ни одно из предложенных решений не помогло мне. Я заставил оформить заказ в моем новом отделении и вытащил мастера.

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init

4

Эти две функции

  1. git rm --cached
  2. git checkout -f another-branch

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

Вместо этого я физически удалил файл (в Eclipse), как говорит Git;

Please move or remove them before you can switch branches.

и затем я добавляю / фиксирую это.

а потом я потянул и все заработало!


3

В моем случае git rm --cachedне сработало. Но я получил это сgit rebase


3

Я также столкнулся с подобной проблемой, и я попробовал все решения, опубликованные выше, но это не сработало

Проблема была вызвана , когда я переименовал мой onMusicUpdateListener.javaTo OnMusicUpdateListener.javaв developотрасли.

Теперь masterимел onMusicUpdateListener.java и developимел тот же файл, что иOnMusicUpdateListener.java

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

The following untracked working tree files would be overwritten by checkout

а потом это aborted.

Для того , чтобы решить эту проблему, я с силой checked out masterрасшириться , а затем переименовал мой onMusicUpdateListener.javaк OnMusicUpdateListener.java, committedон и тогда mergedона с developветки.

Затем я обновил свою developветку по mergingнему в masterи теперь все возвращается к нормальной жизни, и проблема решена.


Я сталкивался с подобными проблемами раньше. Насколько я понимаю, проблема чувствительности к регистру кажется проблемой только для Windows. Я полагаю, вы разрабатываете на Windows?
Ji_in_coding

2

Это может быть проблема с разрешением,

изменить владельца,

sudo chown -v -R usr-name:group-name folder-name

У меня тоже была та же проблема, что и у Вона. Я добавил .gitignore в папку, которая уже отслеживалась. Я удалил файл, а затем смог сделать git checkout.
cbloss793

2

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

Вы можете удалить один из этих файлов или переименовать его. Пример:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

2

Переместить файлы вместо удаления

Один из способов избежать удаления файлов - переместить их. Например:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done

1

Если вы переименовали файл локально, а затем сделали a pull, он отобразит это сообщение об ошибке.


Как преодолеть эту ошибку в таком случае? Это сообщение также появляется при переключении веток после изменения регистра в имени файла (MyFile => myfile).
Бернхард Доблер

1

это легко решить, git говорит, что у вас есть одинаковые файлы в обеих ветвях, поэтому вы должны удалить определенные файлы из основной ветки, и тогда вы сможете объединить:

git merge "your branch"

Я надеюсь, что это работает для вас, я только что решил свою ошибку. моя ошибка была:

error: The following untracked working tree files would be overwritten by merge:
        .vs/slnx.sqlite
Please move or remove them before you merge.
Aborting

Теперь это работает! В моем случае .vs/slnx.sqliteбыла сгенерирована Visual Studio, мне нужно было закрыть его, прежде чем удалить его.


0

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

Так что это говорит о том, что есть файлы, которых у вас нет, но которые вы не можете получить от контроля версий.

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


0

Удалите файл .gitignore из appname / gen /, чтобы решить эту проблему.


0

Я просто пошел в файловую систему и удалил файл напрямую, затем продолжил с git checkout, и это сработало.

Я сталкивался с проблемой несколько раз, и это может быть связано с тем, что разработчики делают удаление, push, re-add, push или что-то подобное.


0

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

git merge --strategy=ours master 

0

Просто удалите файлы или переименуйте их.

например

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

Мне пришлось переименовать / удалить ajax / product.php и ajax / produtPrice.php .

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

Если это не помогает, то вы должны удалить всю ветку и создать ее заново, а затем сделать git pull origin remotebranch


0

Чтобы сохранить измененные файлы и использовать измененный контент позже. Я обнаружил эту ошибку, когда я пытаюсь проверить ветку и при попытке перебазировать. Попробуй Git stash

git stash


0

Проверьте, если какое-либо имя папки имеет «/» или какой-либо специальный символ, затем переименуйте эти папки. Затем вы просто клонируете хранилище в другое место.


0

Простое решение может быть следующим: просто убедитесь, что вы находитесь в правильном рабочем каталоге в GitBash. Это сообщение возникает почти каждый раз, когда пользователь пытается объединить каталог слишком высоко в своей иерархии папок.

Пример:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

Сценарий: пользователь клонировал репо, git-folderон создал новый проект Java в Eclipse, импортировал клонированное репо. Eclipse установил myProjectSourceFolder в качестве папки источника в своем локальном проекте. поэтому Пользователь ввел его в git bash и толкнул, вытащил и зафиксировал свой проект оттуда. Поэтому git синхронизируется, myProjectSourceFolderно не имеет записи в своей истории для myBashSourceFolder. Поэтому push / pull / merge из myBashSourceFolder произведет заданный вывод, если пользователь попытается выполнить синхронизацию оттуда в следующий раз вместо папки, с которой он работал раньше.

Решение: введите правильную папку и попробуйте снова. Практически каждый раз, когда я сталкивался, это решение работало нормально :)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.