2015-04-10 2 views
1

Я работаю над проектом, который я развертываю как на gh-страницах, так и в качестве приложения для Android с использованием разрыва между кордорой и телефоном.Поддержание ветвей git с различной файловой организацией

http://github.com/derekmc/html-sandbox

В настоящее время код для обоих внедрений очень похожи и поддержания отдельных отраслей не было проблемой.

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

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

Я не специалист по git, но, исследуя проблему, похоже, это осложнит слияние между двумя ветвями.

Все я нашел этот вопрос: git merge: apply changes to code that moved to a different file

Есть ли практический способ поддерживать параллельные ветви с другой организацией файлов? Какой был бы лучший способ сделать это?

Есть ли что-то, что я мог бы сделать, чтобы файловая организация двух развертываний была такой же?

+0

Вы можете поместить общий код в каталог и использовать git cherry-pick при слиянии, выбрав только этот каталог. Вы можете попробовать сделать общий код его собственным проектом и включить через git-подмодуль в два основных проекта: http://git-scm.com/docs/git-submodule. – Jonah

+0

Я бы исследовал, как сделать ссылки для phonegapbuild, чтобы эти ссылки были созданы в качестве первого шага в этой сборке. – jthill

ответ

0

Поддержание различных макетов может быть частично решено ответить на вопрос Why doesn't git attempt to merge changes to renamed files?.

«Стратегия сращивания по умолчанию объединяет только конечные результаты, не каждый совершает»

Предположительно его просто вопрос выбора соответствующей merge strategy?

+0

Это не просто стратегия * default *, которая делает это, это сама команда 'git merge'. Даже если вы пишете пользовательский драйвер слияния и устанавливаете его с помощью '.gitattributes', ваш драйвер слияния получает не более 3 идентификаторов фиксации: база,« локальная »или« наша », а также« удаленная »или« другая »или «их» совершают (разные биты Git используют другую терминологию здесь, вероятно, потому, что в какой-то момент бит копировались из других систем слияния). Между тем, большинство стратегий занимают две головы. Стратегия «осьминога» касается многих, но не позволяет делать что-либо * с конфликтами, обойдя проблему «не более 3». – torek

+0

(я должен на самом деле сказать «идентификаторы файлов», поскольку драйверы слияния получают хеши файлов, а не хеширование. Стратегия 'ours' может разрешать несколько глав, но игнорирует все, но, ну, наши, так что это также оборачивает проблему, а если одна версия отсутствует, нет никакого фактического слияния, поэтому драйвер слияния всегда получает три идентификатора.) – torek

0

Вы can -I не хотел бы, но вы могли бы принять подход, который слияния всегда выполняются из, в, и с «канонической формой» дерева. (Кстати, модифицированная версия этого, «канонизирующего» атрибута конца строки, является тем, что для управления конфигурацией слияния merge.renormalize. К сожалению, нет эквивалента имен файлов.)

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

  o--o--o--A <-- branch1 
     /
...--o--* 
     \ 
      o--o--B  <-- branch2 

того слияние баз * имеет каноническую схему, и совершить A имеют каноническое расположение и B имеет каноническое расположение и Git может просто объединить все файлы по их каноническим именам. Допустим, что слияние идет на branch2:

  o--o--o--A  <-- branch1 
     /  \ 
...--o--*   \ 
     \   \ 
      o--o--B------M <-- branch2 

Теперь вы проверить обе ветви и «де-канонический-форму» их, если это необходимо:

  o--o--o--A----o  <-- branch1 
     /  \ 
...--o--*   \ 
     \   \ 
      o--o--B------M--o <-- branch2 

и вы готовы продолжать их использовать.Будущей базой слияния будет commit A, который, как мы только что видели/сделал, находится в «канонической форме».

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

На практике мы никогда не нужно сделать такую ​​глупость , так как все системы сборки могут иметь дело с макетом разумно, или - как jthill suggested in a comment - можно обмануть его.


"What, never?"

"Что, все ... о никогда не ум." «Что, никогда?»

+0

Что вы подразумеваете под всеми системами сборки, которые могут иметь дело с макетом разумно? Вы имеете в виду оставить структуру каталога в одиночку и использовать относительную ссылку? –

+0

Разве это не приводит к тому, что дерево каталогов вашего проекта сводится к потребностям вашего VCS, а не к тому, чтобы быть независимым инструментом, каким он должен быть? –

+0

@BruceAdams: В порядке: (1) уверен, что бы это ни потребовалось; (2) да. Это не оптимально. Было бы неплохо, если бы у Git был способ сопоставить «имя репозитория» с «именем дерева работ», например, для ограничения ограничений имен файлов в Windows и Mac, но это не так. Если бы это было так, то карта была бы способом сделать это с меньшим количеством (но все же слишком многих, по моему мнению) искажений. – torek

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