Git: предотвратите создание некоторых файлов, автоматически поместите все

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

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

Как мне это исправить?


person Coder-256    schedule 08.04.2016    source источник
comment
Я нахожу ваш вопрос неясным. Вы хотите изменить файлы, являющиеся частью репозитория, но не допустить их промежуточного хранения при выполнении git add? Помогает ли вам с вашей проблемой использование файла .gitignore?   -  person Enrico    schedule 16.04.2016
comment
Рассматривали ли вы вместо этого фильтр размазать/очистить ? Таким образом, вы можете применить свою пользовательскую конфигурацию при оформлении заказа, но вы также можете гарантировать, что ваши настройки не будут зафиксированы.   -  person sschuberth    schedule 16.04.2016
comment
@VonC только что добавил ответ, основанный на том, что я предлагал :-)   -  person sschuberth    schedule 16.04.2016
comment
@ssschuberth Я согласен. Это похоже на работу для драйвера фильтра содержимого.   -  person VonC    schedule 16.04.2016
comment
Вот аналогичный вопрос, который я задал некоторое время назад: -file" title="игнорировать определенные изменения в файле в git, но не во всем файле"> stackoverflow.com/questions/16598257/   -  person Kevin    schedule 16.04.2016


Ответы (2)


Один из способов — изменить этот файл конфигурации таким образом, чтобы он был виден только вам локально.
Но таким образом, чтобы он оставался невидимым для других пользователей этого репозитория.

Если эти изменения четко определены (а не повсеместно в your.config.file), вы можете рассмотреть драйвер фильтра контента, чтобы чтобы создать правильный контент для этого файла конфигурации при оформлении заказа:

(отредактируйте или создайте файл .gitattributes в корневой папке вашего локального репозитория и добавьте в него строку выше. Вы можете добавить, зафиксировать и отправить этот файл: это не окажет никакого влияния на других пользователей).

smudge
(изображение из "Настройка Git — атрибуты Git", из "книга Pro Git")

cd /path/to/your/local/cloned/repo
git config filter.filterconfig.smudge 'update_config'
git config filter.filterconfig.clean 'restore_config'

Скрипты update_config и restore_config могут располагаться где угодно на вашем локальном $PATH (они находятся в bash, даже если вы работаете в Windows, так как они будут выполняться mingw git bash).

Сценарий update_config будет:

  • сделать начальную копию файла конфигурации,
  • внесите свои изменения в файл конфигурации.

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

И скрипт restore_config будет восстанавливать сохраненную копию файла всякий раз, когда он вызывается git (например, он будет запускаться git status или git diff):

cat saved_copy

Таким образом, файл конфигурации кажется никогда не меняющимся с точки зрения git.

person VonC    schedule 16.04.2016
comment
Ваш ответ очень неясен, ссылаясь на такие вещи, как updateconfig и update_config, и на два разных способа их установки. Пожалуйста, предоставьте более четкие пошаговые инструкции (я не знаком с .gitattributes). - person Coder-256; 16.04.2016
comment
@ Coder256 Я изменил имя параметра атрибута updateconfig, чтобы избежать путаницы. Это имя конфигурации, связанное с вашим конфигурационным файлом, чтобы связать 2 драйвера фильтра: один для внесения ваших изменений, другой для восстановления исходного содержимого. - person VonC; 16.04.2016
comment
@ Coder256 Вам нужны обе .gitattributes, и две (2) команды git config filter, чтобы активировать этот фильтр, и вам нужно написать два сценария bash, один из которых сохраняет исходное содержимое в файл saved_copy , и добавьте свои модификации, которые восстановят его содержимое (одна строка: cat saved_copy) - person VonC; 16.04.2016

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

Когда вы делаете свою разработку, вы проверяете свою частную ветку, но не фиксируете ее. Как только вы удовлетворены своими изменениями, вы прячете их, проверяете общедоступную ветку, выполняете git stash pop и фиксируете результат. После этого вы возвращаетесь в свою приватную ветку и объединяете свой новый коммит. В результате история будет выглядеть примерно так:

*   (HEAD->private) merge
|\
| * (public) commit 3
* | merge
|\|
| * commit 2
* | a change in your local configuration
* | merge
|\|
| * commit 1
* | some private configuration changes
 \|
  * some base commit

Теперь, если вы нарисуете историю ветки public, вы получите следующее:

* (public) commit 3
* commit 2
* commit 1
* some base commit

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

Цена за это, конечно, хлопоты с постоянно меняющимися ветками. Поэтому я бы избегал такой конструкции, насколько это возможно, но в некоторых ситуациях она может быть полезна.

person cmaster - reinstate monica    schedule 16.04.2016