2016-11-01 4 views
0

Вот мой сценарий. Я был на ветке A, где я внес некоторые изменения в определенный файл на моей локальной рабочей копии.Git Ignore не работает

/launcher/file.esb

Я в принципе хочу следующее:

  1. Игнорировать изменения, внесенные в этот файл полностью. Я выполнил это с использованием Предположим, что без изменений
  2. Откажитесь от этого файла с помощью контроля версий, который я попытался выполнить с помощью .gitignore.

  3. Сохраните изменения в этом файле в моей локальной рабочей папке, когда я закажу различные ветви. A-> разработ-> B-> C и т.д. ...

Это # 3, что я не в состоянии выполнить. Как только я проверяю новую ветку и делаю попытку, старые изменения перезаписываются в файле.

Почему это происходит? Не следует ли включить этот путь к файлу в .gitignore, чтобы полностью удалить этот файл вне досягаемости контрольных щупалец версии?

Как я могу достичь # 3?

Этот вопрос не похож на тот, который упоминается в ссылке «Возможный дубликат». Heres why:

Вот в основном то, что я хочу в словах. Msgstr "Поместить этот отдельный файл в основном в« оболочку », которая не будет перезаписана во время ЛЮБОГО git-операций и не будет принята во внимание, если изменится». Это в основном исключает любую форму синхронизации управления версиями между этим файлом и промежуточным/удаленным. Этот локальный файл и версия на стадии/удалении должны существовать с взаимным и полным отключением.

+0

Возможный дубликат [Отключить отслеживание и игнорировать изменения в файле в Git] (http://stackoverflow.com/questions/936249/stop-tracking-and-ignore-changes-to-a-file-in-git) –

ответ

4

Это происходит потому, что файл уже является частью репозитория. Поэтому, когда вы переключаете ветви, вы получаете версию этого файла из ветки, которую вы проверяете. Файл gitignore запрещает git просматривать файлы, которые не являются частью репозитория. Это сделано, поэтому git не включает определенные файлы в команды, такие как git add . или git commit -a. И предположим, что неизмененные приемы настройки git не видят изменений, но это означает, что Git может свободно перезаписывать файл при проверках, так как он знает, что файл не отличается от совершенной версии.

Если вы хотите удалить этот файл из git control и самостоятельно управлять изменениями, вы можете использовать git rm --cached /launcher/file.esb и зафиксировать изменение. Это приведет к удалению этого файла из индекса, и файл больше не будет отслеживаться git. Параметр --cached запрещает git фактически удалять файл из вашего рабочего каталога. Возможно, вам придется делать это отдельно для каждой ветви, потому что удаление файла из одной ветви не удаляет его из других ветвей. Для этого вы можете отказаться от предполагаемого без изменений, а затем использовать команду git stash, чтобы временно сохранить ваши локальные изменения.

+0

git rm --cached, я пробовал его, как миллион раз. Проблема в том, что когда я фиксирую файл git rm'd и перетаскиваю ветку в начало, этот файл отображается как «удаленный» во время PR. Когда я попытаюсь объединить эту ветку с разработкой, будет ли этот файл фактически удален из Dev? В любом случае у меня возникают проблемы, так как этот файл появляется во время PR. – Ace

+0

Вот в основном то, что я хочу в словах. Msgstr "Поместить этот отдельный файл в основном в« оболочку », которая не будет перезаписана во время ЛЮБОГО git-операций и не будет принята во внимание, если изменится». Это в основном исключает любую форму синхронизации управления версиями между этим файлом и промежуточным/удаленным. Этот локальный файл и версия на стадии/удалении должны существовать с взаимным и полным отключением. – Ace

+0

Насколько я знаю, нет стандартного способа делать то, что вы хотите. Когда вы выполняете 'git pull', вы по существу объединяете свое дистанционное репо в свой локальный (' git pull' - это в основном ярлык для 'git fetch' и' git merge'). Поэтому, если файл управляется пультом дистанционного управления, он будет объединен с локальным приложением. Простое решение состоит в том, чтобы сделать 'git stash' до того, как вы сделаете' git pull' и сделаете 'git stash pop' после pull, так что ваши локальные изменения остаются. Это должно работать нормально до тех пор, пока файл не будет изменен кем-либо другим способом, который может вызвать конфликт. –

1

Отключить этот файл от контроля версий, который я попытался выполнить с помощью .gitignore.

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

Вы также должны удалить из индекса (с помощью [git rm --cached](https://git-scm.com/docs/git-rm)) и зафиксировать изменение. Только после этого Git останавливает отслеживание файла. Добавление его имени в .gitignore только сообщает ему прекратить его перечисление в разделе Untracked files на выходе git status.

Однако, если вы проверили чек, созданный до удаления файла из репо, коммит содержит файл, и Git попытается проверить его.