.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 ]

8 голосов
/ 19 августа 2014

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

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

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

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

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

У меня была такая же проблема при проверке ветки на основе более раннего коммита.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, упомянутые выше, будут потеряны.

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

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

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

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

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init
3 голосов
/ 08 февраля 2017

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

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

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

и затем я вытащил, и это сработало!

3 голосов
/ 14 июня 2012

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

3 голосов
/ 01 сентября 2015

У меня тоже была похожая проблема, и я попробовал все решения, опубликованные выше, но она не сработала

Проблема возникла, когда я переименовал мой onMusicUpdateListener.java в 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, и теперь все возвращается в норму, и проблема решена.

2 голосов
/ 10 ноября 2016

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

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

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)
2 голосов
/ 24 апреля 2015

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

смена владельца,

sudo chown -v -R usr-name:group-name folder-name
2 голосов
/ 10 марта 2017

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

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

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done
1 голос
/ 23 октября 2017

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

...