it-swarm.com.ru

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/*

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

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

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

731
marcamillion

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

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

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

ПРЕДУПРЕЖДЕНИЕ: он удалит неотслеживаемые файлы, поэтому это не лучший ответ на поставленный вопрос.

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

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

911
Scott Schafer

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

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

518
Régis

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

git config core.ignorecase true
122
mattbasta

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

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

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

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

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

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

41
Greg Hewgill

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

git clean -i

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

21
Abhishek Goel

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

 1. git fetch --all
 2. git reset --hard Origin/{branch_name}
14
Chamara Jayalath

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

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

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

11
Kyle Clegg

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

git clean -f

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

git clean --dry-run

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

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

10
mc_kaiser

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

git checkout -f dev
9
GeekHades

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

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

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

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

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

У меня была такая же проблема при проверке ветки на основе более раннего коммита. 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, чтобы избежать появления нежелательных изменений.

7
Juri Sinitson

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

  • git checkout -f my_branch
  • git pull Origin master
  • git submodule update --init
4
Bruno Pinheiro

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

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

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

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

3
In-young Choung

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

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

3
Sheraz Ahmad Khilji

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

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

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

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

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

Sudo chown -v -R usr-name:group-name folder-name
2
Won Jun Bae

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

2
Hillkorn

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

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

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)
2
Samuel Vicent

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

1
lyuboslav kanev

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

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

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

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

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

1
jeirueda

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

git merge --strategy=ours master 
0
Erdinç Çorbacı

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

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

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

0
Markosaurus

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

0
Codemaker

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

например 

$ 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
Black

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

0
vishnuc156

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

git stash

0
MöĦämëđ ÏbŗäĦïm

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

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

0
Phil Carter