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, чтобы протестировать некоторые вещи и вернуться к текущей версии. Я бы сделал это в следующих шагах:
Настройте неотслеживаемые файлы: отредактируйте
.gitignore
и применить$ git rm -r --cached
в файлах и каталогах, которые вы хотите игнорировать. Добавьте также файл.gitignore
сам к.gitignore
и не забудьте оформить$ git rm -r --cached .gitignore
, Это гарантирует, что поведение игнорирования git оставляет то же самое в предыдущих коммитах.Передайте изменения, которые вы только что сделали:
$ git add -A
$ git commit
Сохраните текущий журнал, иначе у вас могут возникнуть проблемы с возвратом к текущей версии
$ git log > ../git.log
Хард ресет к коммиту K
$ git reset --hard version_k
Создать ветку на основе коммита K
$ git branch commit_k_branch
Оформить заказ в эту ветку
$ git checkout commit_k_branch
Делай свои вещи и совершай это
Оформить заказ снова в мастер
$ git checkout master
Сброс к текущей версии снова
$ git reset current_version
или же$ git reset ORIG_HEAD
Теперь вы можете сбросить жесткий в ГОЛОВУ
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 out
master
филиал, а затем переименовал мой 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
.
(текущая ветка главная )
git merge dev
> Уже в курсе
git branch -d dev
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