.gitignore та "Наступні незавершені файли робочого дерева будуть перезаписані під замовлення"


826

Тому я додав папку до свого .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/*

Як зробити так, щоб я міг перемикати гілки, не видаляючи ці файли?

Якщо я внесу зміни, це вплине на ці файли? Іншими словами, якби я після цього повернувся до цієї гілки, все було б ідеально, як і до останнього мого зобов’язання?

Я не хочу втрачати ці файли, я просто не хочу, щоб вони відслідковувалися.


10
якщо вас справді не цікавлять ці файли: git checkout -f <branch> У моєму випадку файли генеруються в процесі збирання, тому я не переймаюся менше
Hobbamok,

Іноді трапляється, якщо ви робите "git checkout" (без назви гілки). Для того, щоб виправити, зробити «мерзотник контроль branchname»
крафтеров

Окреме, але критично пов’язане питання: чому ця помилка взагалі виникає? Чому не можна просто переключитися між гілками
ahnbizcad

@ahnbizcad Оскільки, якщо ви працювали над новим файлом, а хтось на іншій гілці трапився з таким самим іменем, ви змушені злитися, якщо git зруйнував вашу версію при переключенні гілок. Ось чому прапор -f там.
Метью Шарп

Відповіді:


263

Схоже, ви хочете, щоб файли були проігноровані, але вони вже зафіксовані. .gitignore не впливає на файли, які вже знаходяться в репост, тому їх потрібно видалити за допомогою git rm --cached. Це --cachedдозволить запобігти будь-якому впливу на вашу робочу копію, і вона буде проставлена ​​як видалена наступного разу, коли ви здійснюєте її вчинення. Після вилучення файлів з репо-файлу, то .gitignore не дозволить знову їх додавати.

Але у вас є ще одна проблема з вашим .gitignore, ви надмірно використовуєте подстановочні символи, і це призводить до того, що він відповідає менше, ніж ви очікуєте. Натомість давайте змінимо .gitignore і спробуйте це.

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

2
Дякую .... Я видалив усі файли з поточної гілки та створив резервну копію. Потім переключили гілки і поклали їх назад. Це спрацювало. Також спасибі за підказку щодо .gitignore, хоча
marcamillion

@marcamillion: Що ви маєте на увазі під "що працювало"? Якщо файли відслідковувались на гілці, на яку ви перейшли, ви перезаписали їх у своїх версіях, які можуть бути різними ...
Cascabel

1
У мене виникла проблема з папкою / build, яку не потрібно відстежувати. Тому я видалив локальну папку, вчинив мій файл .gitignore, а потім перевірив іншу гілку. Це, нарешті, спрацювало для мене.
Майк С.

16
Я думаю, що перша частина полягає у звороті цього конкретного повідомлення про помилку. Ця помилка говорить про те, що користувач наразі перебуває у відділенні, у якому не відстежуються ті JPG-файли, і користувач намагається перейти до того, що це робить. Таким чином, це git rm --cachedне матиме значення, ці файли не існують у поточній гілці. Для цієї помилки я вважаю, що користувачеві потрібно слідувати відповіді @Greg Hewgill - "перемістіть їх з робочої копії, перемкніть гілки та поверніть їх назад".
studgeek

4
Як би один йти про рішення your files would be overwrittenз , fatal: pathspec 'test/node_modules' did not match any filesколи я роблю git rm -r --cache test/node_modules? Я не можу тягнути через переписане повідомлення і не можу видалити, тому що git не може їх знайти (вони там є)
HMR

1045

ПОПЕРЕДЖЕННЯ: це видалить незатребувані файли, тому це не чудова відповідь на поставлене питання.

Я також потрапив у це повідомлення. У моєму випадку я не хотів зберігати файли, тому це працювало для мене:

git 2.11 і новіші

git clean  -d  -f .

старший git

git clean  -d  -f ""

Якщо ви також хочете видалити файли, проігноровані git, виконайте наступну команду.

БЕРЕГО !!! ЦЕ НАЙБІЛЬШЕ ВІДБУДУВАННЯ ВАШУ ПРОЕКТУ, ВИКОРИСТОВУЙТЕ ТОЛЬКО ЯКЩО ЗНАЙТЕ 100%, ЩО ВИ РОБИТИ

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 потрібно змусити його працювати.


7
Спасибі, після цього чистого я зміг відновити базу;
Олександр Бєлецький

139
Будьте уважні, коли РУННЯТЬ git чистий!
Ноель

249
Щоб уникнути facepalm, спочатку запустіть її за допомогою опції «сухий пробіг», щоб побачити, що вона буде робити: git clean -dfxnабоgit clean -dfx --dry-run
Dennis

74
О ні. Це видаляє всі конфігураційні файли на моєму xcode і тепер проект перетворюється на mac-проект. Будьте ДУЖЕ ДЕРЖАВНИМИ, КОЛИ ПОВЕРНУТИСЯ ЦУ КОМАНДУ. Я думав, що це видалить його лише з git.
tyegah123

25
-xВаріант мені боляче
Wener

589

Попередження: Це видалить локальні файли, які не індексуються

Просто змусити його: git checkout -f another-branch


78
Попередження: Це видалить локальні файли, які не індексуються.
givanse

git clean не працював для мене, але сила була саме тим, що мені потрібно. Він був застряг на цій гілці, і я просто потребував її, щоб поміняти гілки.
Саймон Кіт

7
Я не хотів, щоб файл, який не був індексований! +1 для вас
ryansstack

я отримав цю помилку ,,, :(error: pathspec 'mybranch' did not match any file(s) known to git.
Буді Мульо,

2
Це справжня відповідь.
metamonkey

145

Якщо ви перебуваєте в ОС X X, це може бути тому, що в імені файлу змінилися регістри певних символів. Спробуйте встановити таку опцію конфігурації:

git config core.ignorecase true

13
Він також працював у Windows, схоже, що ця ситуація сталася в першу чергу через зміну справи, яку GIT не міг визначити
SagiLow

4
Саме з цією проблемою у мене був шлях до файлу, який відрізнявся від одного букви - Windows трактує це так само, але GIT - це не проблема.
Данило Соколовський

1
Моя проблема трапилась під час оформлення іншої гілки в Windows 10, і тільки ця робота для мене, Дякую
Weijie Вс

приголомшливий! це вирішило мою проблему, коли я рухався між тегами
Вільям Аньєс

1
Це також працює, якщо ви намагаєтесь git rebaseтакож. Дякую.
користувач3890355

42

Git повідомляє вам, що він хоче створити файли (названі public/system/images/9/...тощо), але у вас вже є існуючі файли, які не є відслідковуються Git. Можливо, хтось ще додав ці файли до сховища Git, і це перший раз, коли ви перейшли в цю гілку?

Напевно, є причина, чому ці файли у вашій developфілії, але не у вашій поточній гілці. Можливо, вам доведеться запитати своїх співробітників, чому це так.

як мені це зробити, щоб я міг перемикати гілки, не видаляючи ці файли?

Ви не можете це зробити, не змушуючи файли якось зникати. Ви можете перейменувати publicв my_publicабо що - то зараз.

якби я після цього повернувся до цієї гілки, чи все було б ідеально, як і до останнього вчинку?

Якщо ви внесете свої зміни, Git їх не втратить. Якщо ви не зробите своїх змін, Git дуже постарається не перезаписати виконану вами роботу. Про це Git попереджає вас у першу чергу тут (коли ви намагалися переключити гілки).


Дякую за пояснення. Я створив резервну копію файлів, перемкнув гілки і об'єднав їх, а потім замінив файли в загальнодоступній папці. Це спрацювало.
marcamillion

1
Як я коментував відповідь @ Arrowmaster. Це правильна відповідь на повідомлення про помилку. Це може бути не правильною відповіддю для цього особливо питаючого, оскільки справжні проблеми, здається, є його гітігнором.
studgeek

37

Це працювало для мене.

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

5
Будь ласка, додайте пояснення до свого рішення. см stackoverflow.com/help/how-to-answer
user7294900

Ось мій взяти. У вашій місцевій копії віддаленої гілки якимось чином є всі незафіксовані файли. Ви перевіряєте це, щоб відновити незавершені файли, на які спочатку скаржилися. Тепер ви можете перейти на інші відділення
ahnbizcad

2
Чомусь це єдине робоче рішення для мене. Дякую, друже.
Ківад

Вирішив мою проблему. Спасибі
Девашіс Кант

Велике спасибі, так просто! git reset - програмне походження / розвиток. Як я ненавиджу ці редагування конфліктів злиття. Ця команда така приємна і проста.
дев'ять п'яти

22

Існує команда для цього делікатного завдання (назавжди видалення незатребуваних файлів)

git clean -i

Тоді git pullзробимо.


13

Для тих, хто потребує чогось менш далекосяжного, ніж відповідь Скотта Шафера ,

git clean -f

швидше за все, спрацює. Я настійно пропоную бігати

git clean --dry-run

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

Дивіться цю відповідь на переповнення стека або документи для отримання додаткової інформації про git clean.


12

На жаль, ні git rm --cachedабоgit clean -d -fx "" не зробив це для мене.

Моє рішення врешті-решт було штовхати мою гілку на віддалений, клонувати нове репо, потім робити моє злиття у нове репо. Інші люди, які зверталися до РЕПО, повинні були зробити те саме.

Мораль історії: використовуйте .gitignoreфайл із початку.


10

Якщо ви хочете швидко вирішити це питання, ви можете скористатися цією командою:

git checkout -f dev

Це допомогло мені, коли моє питання не було пов'язане з .gitignoreafaik.
Накілон

помилка: pathspec 'dev' не відповідає жодному файлу, відомому git.
Чорний

@Black 'dev' - це назва філії, замість цього поставте своє відділення
Vinit Solanki

8

У мене була така ж проблема, коли виїжджали у відділення на основі попередніх зобов'язань. 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, на які скаржилися вище, загубляться.

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

Якщо ви знову завітаєте до вищезазначеної гілки, не забудьте оформити, $ git statusщоб не з’являлося небажаних змін.


8

Це сталося зі мною в системі Windows 8 , використовуючи Git з командного рядка. Решта моєї команди використовує TFS , а я використовую git-tf Microsoft для натискання / перетягування між TFS та моїм локальним сховищем Git.

Проблема виникла через деякі файли, які були перейменовані лише для зміни своєї справи . Здається, що це сталося:

  • Файли були зареєстровані зі змішаним кожухом у своїх назвах.
  • У подальшому фіксації імена файлів були змінені на всі малі регістри.
  • git-tf спочатку отримав файли у змішаному регістрі.
  • Коли файли були перейменовані на малі регістри, git-tf не отримав файли, оскільки для Windows 8 ці імена файлів еквівалентні.
  • Оскільки Git відрізняється від регістру, він скаржився, що у мене були файли змішаних регістрів, які не знаходилися під контролем джерела. Але використовуючи git status, я не зміг побачити жодних змін, оскільки в командному рядку Windows ці назви файлів є рівнозначними.

Найпростішим рішенням для мене було:

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

+1 я зміг скористатися журналом git на поточній гілці та гілці для відновлення базу даних, щоб побачити, коли відбулася фіксація, яка змінила справу; то я зламав навколо нього ...
мудрець

4

Ці дві функції (git rm - кешировано, git checkout - якщо інша гілка) для мене НЕ працювали.

Натомість я фізично вилучив файл (у затемненні) як те, що говорить Git; Будь ласка, перемістіть або видаліть їх, перш ніж ви зможете перемикати гілки.

а потім я додаю / вчиняю.

а потім я потягнув і це спрацювало!


4

У моєму випадку проблема була з підмодулями. masterбуло об'єднано з іншою галуззю, яка додала новий підмодуль до проекту. В гілці, яку я намагався перевірити, її не було, тому Git скаржився на відслідковувані файли, і жодне з інших запропонованих рішень не працювало на мене. Я примусив каси до своєї нової філії, і потягнув майстра.

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

3

У моєму випадку git rm --cachedне вийшло. Але я отримав це з agit rebase


3

Я також стикався з подібною проблемою, і я спробував усі рішення, розміщені вище, але це не спрацювало

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


Я раніше стикався з подібними проблемами. Наскільки я розумію, проблема чутливості регістру є проблемою лише для Windows. Я думаю, ви розвиваєтеся на windows?
Ji_in_coding

2

Це може бути проблема дозволу,

змінити право власності,

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

У мене також було те саме питання, що і Вон. Я додав .gitignore до папки, яка вже відстежувалася. Я видалив файл, а потім зміг зробити git checkout.
cbloss793

2

Проблема може бути двома файлами з тим самим іменем, але різним регістром.

Ви можете видалити його з цих файлів або перейменувати його. Наприклад:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)

2

Перемістіть файли, а не видаляйте

Один із способів уникнути видалення файлів - це переміщення їх. Наприклад:

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

1

Якщо ви перейменували файл локально, а потім зробили це pull, воно відобразить повідомлення про помилку.


Як перемогти цю помилку в такому випадку? Це повідомлення також з’являється під час перемикання гілок після зміни регістру у назві файлу (MyFile => myfile).
Бернхард Дьоблер

1

це легко вирішити, git говорить про те, що ви маєте однакові файли в обох гілках, тому вам потрібно видалити конкретні файли з головного відділення, і тоді ви зможете об'єднатись:

git merge "ваша філія"

Я сподіваюся, що це працює для вас, я просто вирішив свою помилку. моя помилка:

помилка: Наступні файли, що відслідковуються робочим деревом, будуть перезаписані злиттям. Аборти

Зараз це працює! У моєму випадку .vs / slnx.sqlite був створений візуальною студією, мені потрібно було закрити його, перш ніж видалити його.


0

У моєму випадку я бачив цю помилку, оскільки використовую популярну CMS з відкритим кодом, і каталог, який викликав проблеми, - це каталог завантажень, в який пише CMS.

Отже, це було те, що є файли, яких у вас немає, але які ви не можете отримати з версії.

Я перехоплюю всі файли з веб-сайту в реальному часі до мого локального, тоді я перевірю це в репо, сподіваючись, що це виправить проблему.


0

Видаліть .gitignore файл із імені програми / gen /, щоб вирішити цю проблему.


0

Я просто перейшов до файлової системи та видалив файл безпосередньо, потім продовжив перевірку git, і він працював.

У мене виникли проблеми кілька разів, і це може бути пов’язано з розробниками, які роблять видалення, натискання, повторне додавання, натискання або щось подібне.


0

Більшість відповідей стосується видалення або видалення файлів, що є найпростішим способом. Але іноді не хочеться позбуватися локальних файлів. Але зливайтеся зі стратегією, тому git має для цього також рішення;

git merge --strategy=ours master 

0

Просто видаліть файли або перейменуйте їх.

напр

$ 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 origin remotebranch


0

З метою збереження змінених файлів та використання модифікованого вмісту пізніше. Я виявив цю помилку, коли я намагався перевірити відділення та намагався перезавантажити. Спробуйте приховати Git

git stash


0

Перевірте, чи є якесь ім'я папки із символом "/" чи будь-яким спеціальним символом, а потім перейменуйте ці папки. Тоді ви просто клонуєте сховище в інше місце.


0

Простим рішенням може бути: Просто переконайтеся, що ви знаходитесь у правильному робочому каталозі в GitBash. Це Повідомлення виникає майже кожного разу, якщо Користувач намагається об'єднати каталог занадто високо в ієрархії своїх папок.

Приклад:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

Сценарій: Користувач клонував репо, git-folderвін створив новий проект Java в Eclipse, імпортував клонований репо. Eclipse встановив myProjectSourceFolder як папку з джерелом у своєму локальному проекті. тому Користувач ввів його в git bash і відтіснив, витягнув і взяв на себе свій проект звідти. git syncs, отже, myProjectSourceFolder- але не має жодної записи в історії для myBashSourceFolder. Тому натискання / потяг / злиття з myBashSourceFolder видасть даний вихід, якщо Користувач намагатиметься синхронізувати звідси наступного разу замість папки, в якій він працював раніше.

Рішення: Введіть правильну папку та спробуйте потягнути ще раз. Майже щоразу, коли я стикався, це рішення спрацювало чудово :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.