Как зафиксировать изменения в локальном репо, не меняя изменения в удаленном репо с помощью Git - PullRequest
0 голосов
/ 21 мая 2018

В моем Git-репозитории у меня есть файл, который должен содержать местоположение моего рабочего каталога.Это будет отличаться для каждого человека, который клонирует репозиторий, и важно, чтобы этот конкретный файл имел правильный (уникальный) каталог для каждого пользователя.Большая часть содержимого файла является общей для всех пользователей, за исключением уникального пути к файлу.

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

В настоящее время мы работаем с этим путем обновления пути к файлу, чтобы он указывал на наш рабочий каталог, а затем мы никогда не фиксируем это обновление.Мы оставляем это как локальное изменение, и когда мы извлекаем или объединяем ветки, мы храним это локальное изменение, чтобы избежать любых конфликтов.Когда вытягивание / слияние завершено, мы открываем тайник.Вот пример рабочего процесса, в котором мы фиксируем локальные изменения в одной ветви (например, ветви функций), а затем объединяем их с другой веткой (такой как master).Мы помещаем все изменения в обе ветви и используем git stash и git stash pop, чтобы скрыть локальные изменения во время этого процесса.

// starting in branch named "original_branch"
git commit // our other changes that we do want to share with others
git stash  // stash the one file with the updated user directory
git pull
git push
git checkout another_branch
git pull
git merge original_branch
git push
git stash pop

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

Вот как я представляю, что решение будет выглядеть так:

vim special_file.txt // update just that one line in special_file.txt
git commit --local-only -- special_file.txt
git commit -- some_other_file.txt
git push // only pushes the update for some_other_file.txt

Конечно, я только что составил опцию --local-only для git commit, но я надеюсь, что кто-то знает о чем-то подобном.Я проверил Google и переполнение стека, но никто, похоже, не задавал подобный вопрос.


РЕДАКТИРОВАТЬ: До сих пор большинство выдвинутых предложений былисвязанные с решениями, которые не основаны на Git (например, символические ссылки).Первоначально я хотел решение на основе Git, как я описал выше, потому что оно решило бы мою проблему, а также учел ряд других ограничений, которые я еще не упомянул.Позвольте мне перечислить здесь другие ограничения, чтобы их можно было принять во внимание, когда мы пытаемся найти решение.

  1. Инструмент не принадлежит мне или моей команде, поэтому мы можем 't изменить его поведение.
  2. Каждый клон Git должен соответствовать уникальному каталогу.То есть это не может быть общий клон, который используется несколькими пользователями.
  3. Все пользователи используют одну и ту же файловую систему, поэтому использование фиксированного каталога нарушит ограничение (2).
  4. Каждый идентификатор пользователя может соответствовать нескольким клонам Git, поэтому мы не можем настроить наш клон как каталог (или символическую ссылку) с фиксированным именем в наших домашних каталогах, потому что это позволит только один клон Git на идентификатор пользователя.
  5. Инструмент не может развернуть переменные среды, чтобы получить путь к файлу.
  6. Путь к файлу должен быть в этом конкретном файле.Мы не можем включить другой файл, содержащий путь.
  7. Этот файл должен отслеживаться в Git, чтобы мы могли иметь контроль версий для содержимого файла (кроме одногострока, содержащая путь к файлу).
  8. Инструмент обращается к файлу по символической ссылке, которая существует за пределами рабочего каталога.Это означает, что мы не можем использовать относительный путь к файлу, потому что инструмент в конечном итоге будет искать путь относительно символической ссылки, а не искать путь относительно фактического файла в рабочем каталоге.
  9. Решение должно быть реализовано несколькими людьми, поэтому решение должно быть относительно простым, простым и безболезненным.Например, ожидать, что каждый человек создаст несколько идентификаторов пользователей и будет переключаться между ними, когда он хочет переключать задачи, было бы слишком сложно.
  10. В нашем репозитории Git есть много таких файлов, поэтому было бы идеально, если бы мыможет найти решение, которое не требует дополнительных человеческих усилий для каждого файла.

1 Ответ

0 голосов
/ 21 мая 2018

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

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

Вы отодвигаете назад то, что «инструмент работает определенным образом», но это предполагает, что входные данные для инструмента должны быть именно такими, какие вы получаете git checkout;это кажется очень маловероятным.

Я полагаю, что инструмент сам может построить рабочее дерево, вызвав git checkout, и затем не даст вам никакой возможности изменить рабочее дерево, прежде чем делать смешные предположения о том, что полученные файлы локализованы для этого.машина.В этом случае, я полагаю, вы могли бы установить фильтр пятен (через атрибуты git), который будет вводить локальные значения (взятые из среды или локальный файл в определенном месте за пределами хранилища или где-либо еще) в процессе оформления заказа.(Соответствующий чистый фильтр должен был бы убедиться, что локальные значения возвращены обратно.) Это требует большого количества пользовательских сценариев, специфичных для проекта, поэтому помимо изложенной выше идеи, я не могу предложить гораздо более подробную информацию.

Но это большая работа по созданию чего-то, что, я искренне ожидаю, сломается и вызовет странные проблемы, когда вы меньше всего этого ожидаете;и кажется маловероятным, что это необходимо.

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

ПоКстати, я предполагаю, что кто-то предложит использовать флаги skip-worktree и / или assume-unchanged индекса.Это плохая идея.Не для этих флагов, требует ручной настройки каждого репо и рано или поздно приведет к ошибкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...