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

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

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

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

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

33 ответа

Решение

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

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

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

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

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

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

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

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

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

git config core.ignorecase true

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

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

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

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

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

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

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

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

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

git clean -i

затем git pull Сделаю.

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

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

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

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

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

git clean -f

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

git clean --dry-run

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

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

эти команды решили мою проблему:

      git add * 
git stash
git pull

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

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

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

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

git checkout -f dev

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Когда используешьgit switch, вы можете использовать-f/ --force/ --discard-changesфлаг :

      git switch -f $BRANCH_TO_SWITCH_TO

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

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

Сейчас master имел onMusicUpdateListener.javaа также develop был тот же файл, что и OnMusicUpdateListener.java

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

The following untracked working tree files would be overwritten by checkout

а потом это aborted,

Чтобы решить это, я решительно checked outmaster филиал, а затем переименовал мой onMusicUpdateListener.java в OnMusicUpdateListener.java, committed это и потом merged это с develop ветка.

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

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

git merge "твоя ветка"

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

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

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

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

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

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

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

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

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

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

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

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

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

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

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

git stash

В моем случае проблема была связана с изменением имени файла с subscribe.tsк Subscribe.ts.

Так что я проверил, если моя ветка devбыл в курсе текущей ветки, в которой я был, main.

(текущая ветка главная )

  1. git merge dev

    > Уже в курсе

  2. git branch -d dev

  3. git checkout -b dev

Я предпочел следующее, которое будетREMOVEилиDELETEвсе файлы, упомянутыеerror: The following untracked working tree files would be overwritten by checkout:

      # make sure you don't need those files before running the following.
# Otherwise, commit the files in case you would like to have it later

git checkout develop 2>&1 | xargs rm

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

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

В большинстве ответов рассматривается удаление или удаление файлов, что является простым способом. Но иногда вы не хотите избавляться от локальных файлов. Но объединяйтесь со стратегией, так что у 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/product.php и ajax / produtPrice.php.

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

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

Другие вопросы по тегам