gitignore и " следующие неотслеженные рабочие файлы дерева будут перезаписаны checkout"

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

это то, что моя .файл пример выглядит так:

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

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

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

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

26 ответов


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

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

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

предупреждение: он удалит неотслеженные файлы, поэтому это не отличный ответ на поставленный вопрос.

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

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 требуется, чтобы заставить его работать.


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

просто заставить его : git checkout -f another-branch


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

git config core.ignorecase true

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

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

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

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

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

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


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

git clean -i

затем git pull будет делать.


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

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

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


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

git clean -f

будет, вероятно, работать. Я!--9-->очень предлагаем

git clean --dry-run

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

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


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

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

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

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

  1. настройка игнорируемых файлов: отредактируйте .gitignore и применить $ git rm -r --cached в файлах и каталогах, которые вы хотите, чтобы git игнорировал. Добавьте также файл до .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. проверка обратно в master снова

    $ git checkout master

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

    $ git reset current_version или $ git reset ORIG_HEAD

  10. теперь вы можете сбросить жесткий к голове

    git reset --hard HEAD

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

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

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


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

git checkout -f dev

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

проблема возникла из-за некоторых файлы, которые были переименованы только для изменения их дела. Случилось, по-видимому, следующее:--10-->

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

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

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

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

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

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

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

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

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

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

теперь, когда я переключился на master, он дал мне ошибку

The following untracked working tree files would be overwritten by checkout

и потом aborted.

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

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


эти две функции(git rm --cached, git checkout-f another-branch)не работал для меня.

вместо этого я физически удалил файл (в eclipse), как говорит вам Git;пожалуйста, переместите или удалите их, прежде чем вы сможете переключать ветви.

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

а потом я потянул, и это сработало!


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


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

изменить праве собственности,

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

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

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

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

переместить файлы, а не удалить

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

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

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

git объединить "вашу ветку"

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

ошибка: следующие неотслеженные рабочие файлы дерева будут перезаписаны слиянием: .vs / slnx.базы данных SQLite Пожалуйста, переместите или удалите их перед вами объединить. Аборт

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


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

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

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


удалить .gitignore С appname/gen/ чтобы решить эту проблему.


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


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

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


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

git merge --strategy=ours master 

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

например

$ 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 / продукт.в PHP и ajax / produtPrice.в PHP.

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

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