2013-06-15 2 views
9

У меня есть свое местное репо в состоянии, которое запрещает мне совершать, хранить, проверять другую ветку или даже отбрасывать изменения. Поэтому я просто застрял.Застрял репо, используя тайник после нормализации crlf?

Я попытаюсь описать, какие шаги привели меня к этой ситуации, насколько я помню.

Пожалуйста, садитесь.

А, не так давно, на другом компьютере, далеко, далеко ... Иным DEV нормализуется CRLF в проекте в соответствии с: https://help.github.com/articles/dealing-with-line-endings

В то время (вы знаете, скорость света ...) Я сделал некоторые изменения локально, совершил и потянул.

Когда я вытащил Git сказал:

error: Your local changes to the following files would be overwritten by merge: 
    wp-config.php 

wp-config.php был ранее удален из индекса, используя git update-index --assume-unchanged wp-config.php с момента своего файла шаблона конфигурации, адаптированной к каждой локальной среде.

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

  1. переиндексации wp-config.php
  2. stash мой собственный конфиг меняет
  3. pull origin master
  4. stash apply мой конфиг назад

Дела пошли не так в шаге 3. git pull origin master еще поднял ошибку выше, как если бы тень была неэффективной.

git status сказал, что wp-config.php имеет изменения, не поставленные для фиксации. Меня это немного удивило.

Поскольку я спрятал свои изменения, я побежал git checkout -- wp-config.php ... но без всякого эффекта! Файл не был поставлен для фиксации.

Поскольку я становился с умом, я создал новый филиал мою-конфигурацию, добавлен и совершил wp-config.php в него, а затем переключается обратно на мастер, удалено wp-config.php (с использованием git rm) и слился происхождение/мастер ... с успехом!

Итак, теперь, когда мастер был в курсе и чист, я планировал восстановить свою собственную конфигурацию без помощи Git (редактирование файла вручную).

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

git stash 
git stash apply 

И угадайте, что?stash apply не удалось, говоря:

error: Your local changes to the following files would be overwritten by merge: 
    wordpress/license.txt 
    wordpress/readme.html 
    ... 
    (all the files that where modified by the crlf conversion) 

А теперь я застрял на моей ветке (и планируют распилить его, Francophones поймет;)), так как:

  • git stash apply, commit и checkout master дает вышеуказанную ошибку
  • git stash производит запись копить, но не меняет unstaged штатов
  • и git checkout -- <file> ни удаляет unstaged состояния

Единственное, что я могу сделать сейчас, это удалить все эти файлы (используя ОС rm), чтобы иметь возможность вернуться к главной ветке.

Настоящая история.

Мне очень хотелось бы узнать, что произошло на главной ветке, а затем в ветке my-config, и что привело меня в такие ситуации (я подозреваю, что я использовал stash для crlf преобразованного файла).

Важные примечания:

  • Я бегу на Linux
  • git core.autocrlf на input
  • мой .gitattributes такой же, как тот, в "дело-с-линейных окончаний" статьи
  • Я относительно новичок в Git (2-й день жизни с этим)

W курица я stash на моем-конфигурации ответвлении outputed:

warning: CRLF will be replaced by LF in wordpress/license.txt. 
The file will have its original line endings in your working directory. 
... (one for each crlf converted file) ... 
Saved working directory and index state WIP on my-config: dbf65ad my config -- should not be pushed 
HEAD is now at dbf65ad my config -- should not be pushed 

(dbf65ad это только поручаем я сделал на моем-конфигурации филиал)

ответ

1

Лучший способ сбросить локальный модуль должен использовать

git clean -f -x -d 

Это эффективно удаляет все невосстановленные изменения в ваш локальный модуль и возвращает их в состояние «ванили».

-f чистые файлы.
-x чистые файлы обычно игнорируются .gitignore.
-d чистые каталоги.

Теперь запустите git reset --hard origin/<BRANCH_NAME>. Это приведет к сбросу вашего филиала в состояние пульта.

git status в этот момент должен сказать вам:

# On branch master 
nothing to commit (working directory clean) 

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

Если git stash show [email protected]{0} Показать больше изменений, чем ожидалось, вы можете просто применить те, которые хотите видеть, с помощью git checkout [email protected]{0} -- <filename>.

Надеется, что это помогает

+2

'git clean' удалит все необработанные файлы. Я думаю, что незатребованные файлы не имеют ничего общего с моей проблемой. Более того, у меня есть некоторые личные вещи, которых я не видел, я бы пожалел об удалении ... во всяком случае, сработал «git reset -hard». Но это не ценное решение, так как если бы у меня были важные локальные модификации, я бы их потерял (я знаю, что могу получить их с git fsck, но определенно не чистым). – Pierre

+0

Это работало для меня, когда другие рецепты не удались. Благодарю. –

0

Во-первыхам, в отношении страницы помощи GitHub, я бы серьезно рекомендую установить:

git config --global core.autocrlf false 

Пусть изменение резерва Eol явной декларацию в .gitattributes files вместо глобального правила магии: keep core.autocrlf to false.

Во-вторых, вы можете видеть, наблюдаете ли вы те же модификации eol на git stash с git update-index --skip-worktree.

+1

С 'git config --global core.autocrlf false' Теперь я могу четко видеть различия CRLF в' git status', но 'git checkout wp-config.php' не удаляет * не поставленный статус * , (странно, diff, даже двоичный diff не показывает мне, что файлы CRLF diff ... сообщаются равными). И 'git update-index -skip-worktree' не действуют, даже в сочетании с' core.autocrlf false'. Кажется, что обработка CRLF в Git немного эзотерична, даже если 'core.autocrlf' установлен в' false' ... – Pierre

5

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

Вот почему вы спрятали свою работу, вытащили материал (теперь без проблем) и начали снова применять тайник.

С вызовом git stash apply git запускает recursive merge в ваших спрятанных изменениях.

Сообщение об ошибке сообщает, что вы столкнулись с конфликтом слияния. По словам разработчика, stash-documentation это может быть решена с помощью git stash drop после разрешения конфликтов:

«Применение [тайник] может не с конфликтами, в данном случае, это не удаляется из списка притона Вам нужно. чтобы разрешить конфликты вручную и позвонить по телефону git stash drop вручную. "

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

Изменение окончаний линий в рамках проектов & .gitattributes

Согласно документации разработчиков .gitattributes вы можете изменить окончание строки для всех файлов (в активной ветви) со следующими шагами:

$ echo "<<filepattern>> eol=lf" >>.gitattributes 
$ rm .git/index  # Remove the index to force Git to 
$ git reset   # re-scan the working directory 
$ git status  # Show files that will be normalized 
$ git add -u 
$ git add .gitattributes 
$ git commit -m "Introduce end-of-line normalization" 

Замените <<filepattern>> шаблоном, который соответствует вашим исходным файлам - в вашем случае *.py для файлов python (в этом .gitignore-description).

Если у вас есть несколько файлов, которые вы хотите добавить, вы можете добавить несколько определений конца строки в .gitattributes.

Внимание: Поскольку второй шаг требует, чтобы удалить .git/index (который является филиалом конкретного), это должно быть сделано в каждой отрасли вы хотели бы сохранить.

Если у вас есть много ветвей для обработки, вы можете рассмотреть возможность написания короткого сценария iterating through your git branches.

+1

Похоже, когда я добавил '* .py eol = lf' в мои .gitattributes, несколько файлов застрял, git stash и т. д., ничего не сделал, комментируя это, отклеило репо, но я до сих пор не уверен, в чем причина. –

+0

@VaibhavMishra это очень интересно, могу я попросить вас попробовать модифицированный рецепт, я недавно добавил к моему ответу? Мне очень хотелось бы знать, как обращаться с таким поведением, поскольку это происходит часто. – florianb

+0

Привет, я следовал за вашей инструкцией, однако после перехода в другую ветку все концы строк снова появляются, похоже, что я должен делать это везде (в каждой ветке), чтобы он работал –