2010-06-16 3 views
4

Я использую git для отслеживания содержимого, которое некоторые люди меняют и разделяют «только для чтения» с другими. «Читатели» время от времени могут внести изменения, но в основном они не будут.Использование git pull для отслеживания удаленной ветви без слияния

Я хочу, чтобы git «писатели» могли пересобирать отталкиваемые ветви **, если это необходимо, и обеспечить, чтобы «читатели» никогда случайно не сливались. Это обычно достаточно легко.

git pull origin +master 

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

В некотором смысле, я действительно не хочу тянуть. Я хочу точно отслеживать мастер-ветку.


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

+0

Что пользователь может делать с их модификациями? Зафиксировать их в местном филиале? –

+0

С Git 2.0 вы можете попробовать (скоро) 'git config push.ff only'. См. [Мой ответ ниже] (http://stackoverflow.com/a/22354592/6309) – VonC

ответ

7

Вы ищете команду git-fetch.

+0

Боюсь, что нет. git-fetch обновляет локальную копию удаленных филиалов/origin/master, но не обновляет сама ветвь master. Я хочу, чтобы «читатели» могли получить копию изменений, сделанных вверх по течению. – 2010-06-16 20:00:15

4

Вы также можете найти git pull --rebase полезно.

Update:--rebase может быть поведение по умолчанию pull путем установки branch.<name>.rebase = true по отдельным отраслям. Значение branch.autosetuprebase = true будет устанавливать это по новым ветвям по умолчанию, хотя существующие ветви необходимо будет обновить вручную. Или вы всегда можете установить значение --rebase, установив pull.rebase = true глобально.

+0

Именно то, что я искал! – aandis

0

Поскольку вы не хотите вручную сливаясь читатели выборки, вы могли бы написать крюк, чтобы исследовать то, что сошёл и предложит пользователю:

http://git-scm.com/docs/githooks

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

2

Как насчет:

git pull --ff-only origin master 

Я использую часто. К сожалению, как ричард-Hansen @ указал ниже, это не работает в качестве псевдонима:

[alias] 
pull = pull --ff-only 
+3

К сожалению, псевдоним не будет работать. Из 'git help config':« Чтобы избежать путаницы и проблем с использованием скриптов, псевдонимы, которые скрывают существующие команды git, игнорируются ». –

+0

@ RichardHansen вы нашли решение для этого, или это просто невозможно настроить? –

+1

@ AndyHayden: Начиная с Git 2.0 вы можете делать 'git config - global pull.ff only', чтобы заставить git pull действовать как' git pull -ff-only'. –

0

Гит 2,0 (Q2 2014) добавит в commit b814da8 конфиг push.ff:

pull.ff:: 

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

  • Когда установлено значение false, эта переменная сообщает Git о создании дополнительного слияния в таком случае (что эквивалентно предоставлению опции -no-ff из командной строки).
  • Если установлено только, допускаются только такие быстрые слияния (эквивалентно предоставлению опции --ff-only из командной строки).
0

Я думаю, что вы хотите рабочий процесс с помощью двух ветвей. Объединенная локальная ветвь (мастер) и удаленная ветка отслеживания «только для чтения» (удаленная).

Использование двух пультов дистанционного управления на главной ветке позволяет продолжить работу и следить за удаленным проектом. Ваши локальные изменения и объединенные удаленные изменения могут быть перенесены на ваш локальный сервер git.

git push localserver master 

Исходные патчи могут быть созданы и усовершенствованы на ваших дистанционных ветвях отслеживания и представлены в проект.

Отдельная ветка отслеживания для удаленного «только для чтения» позволяет вам готовить исправления и коммитты для восходящего потока к удаленному проекту.

# Master branch is merge of local changes, and remote changes 
git checkout master 
git pull -m origin master 
# Set up a local tracking branch for the 'read-only' remote. 
git checkout -b remote remote master 
# Start reviewing changes between the two branches. 
git diff --name-status ..master 

Если вы хотите вышестоящий патч, результаты сравнение с master..remote может быть использован для определения пропатчить только для чтения удаленной ветви.

git diff master..remote -- files >patch 
git checkout remote 
patch -p1 <patch 
git commit -m "Your patch" 
git format-patch -1 

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

(Настройка мерзавец двойного дистанционного включает в себя редактирование .git/конфигурации, и объясняется в другом месте)

Смежные вопросы