2013-12-24 5 views
31

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

Джек работает в foobar программном доме, Jack является Working Programmer, он любит кодировать и часто фиксирует. Пол, который является менеджером Jack, говорит ему, что мы собираемся начать использовать новый инструмент проверки кода, фабрикат. Джек отвечает, Джек создает местную ветку и начинает работать. Он очень часто добавляет функции и берет свое местное отделение. Теперь, в конце дня, он отправляет запрос фабрикатора.

arc diff development 

John, который является членом команды jacks, пересматривает его код и принимает его изменения. Теперь Джек открывает терминал и перемещается в свой каталог репозитория. Джек создает следующую команду, чтобы закрыть ревизию и объединить его код с ветвью разработки.

arc land --onto development 

Он видит следующее сообщение

Landing current branch 'feature-awesome-features'. 
Switched to branch development. Updating branch... 
The following commit(s) will be landed: 

b2ff76e Added the foo to bar 
33f33ba Added a really important check which can destroy the project or save it 
31a4c9a Added that new awesome feature 
8cae3bf rewrote that awful code john wrote 
bc54afb bug fixes 

Switched to branch feature-awesome-features. Identifying and merging... 
Landing revision 'D1067: Added the awesome feature'... 
Rebasing feature-awesome-features onto development 
Already up-to-date. 
Pushing change... 

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

Summary: Added the awesome feature 

Test Plan: do foo bar testing 

Reviewers: John 

Reviewed By: John 

CC: Paul 

Differential Revision: http://phabricator.foobar.com/D1067 

Теперь Джек печально, потому что он хочет, чтобы увидеть все его фиксации, Джек считает, что это commit делает его похожим на The Hoarder, которого нет. Он хочет это исправить, поэтому он задает вопрос о stackoverflow.

That how may he prevent phabricator from eating his commit history. 
+0

Если это, как сливается у всех выглядят, почему вы думаете, что будет выделить? Во всяком случае, обходной путь состоит в том, чтобы иметь более мелкие ветки. В частности, не допускайте несвязанных изменений в ветвях функций. – tripleee

+2

+1 Для вопроса. Хорошее и подходящее объяснение. :) – mrutyunjay

ответ

9

Вы должны использовать собственный поток GIT такой, как git merge и git push непосредственно вместо. От phabricator arc documentation:

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

* squashing or merging changes from a feature branch into a master branch 
* formatting a good commit message with all the information from Differential 
* and automatically closing the revision. 

Вам не нужно использовать какие-либо из этих рабочих процессов: вы можете просто запустить мерзавец толчок, толчок или рт.ст. СВН фиксации, а затем вручную закрыть ревизию с Интернет.

arc сжимает ваши цели по назначению.

+4

Потому что винтовая документация, правильно? Как глубоко увлекательный мозговой штурм когда-либо превращал его в производственный код. «Тогда давайте просто придерживаться обычных запросов на подачу Git-стиля?», Можно сказать. Нет, не может быть сделано с помощью Phabricator. Модуль находится на своем пути, но он все еще находится в бета-версии. Git's «Commit early and commit often» matra выходит прямо из окна ... – Kafoso

3

Существует some documentation, что объясняет, почему это настройка по умолчанию для arc land.

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

  • Практически все операции с главным/удаленным репозиторием связаны с идеями, а не с фиксацией. Когда у одной идеи много коммитов, все, что вы делаете, более сложно, потому что вам нужно выяснить, какие коммиты представляют идею («виджет foo сломан, что мне нужно вернуть?»), Или какая идея в конечном итоге представлена ​​фиксацией («commit af3291029 не имеет смысла, какой целью является это изменение, пытающееся выполнить?»).
  • Технология выпуска значительно упрощена. Инженеры-разработчики могут легко или легко выбирать идеи, когда каждая идея соответствует одному фиксации. Когда идея представляет собой несколько коммитов, становится легче случайно выбрать половину идеи и в конечном итоге оказаться в состоянии, которое практически гарантировано.
  • Автоматическое тестирование значительно упрощено. Если каждая идея является одной фиксацией, вы можете запускать автоматические тесты против каждой фиксации, а ошибки тестирования указывают на серьезную проблему. Если в каждой идее много коммитов, большинство из этих коммитов представляют собой известное разбитое состояние базы кода (например, контрольная точка с синтаксической ошибкой, которая была исправлена ​​на следующей контрольной точке или с полупринятой идеей).
  • Понимание изменений значительно упрощено. Вы можете делиться пополам и идентифицировать всю идею тривиально, не ловя вперед и назад в журнале, чтобы идентифицировать экстенты идеи. И вы можете быть уверены в том, что вам нужно вернуть, чтобы удалить всю идею.
  • Нет четкого значения при совершении контрольных точек (некоторые из которых, как гарантируется, являются известными сломанными версиями репозитория), сохраняются в пульте дистанционного управления. Рассмотрим теоретический VCS, который автоматически создает фиксацию контрольной точки для каждого нажатия клавиши. Очевидно, что этот VCS будет непригодным для использования. Но многие контрольно-пропускные пункты не сильно отличаются друг от друга, и концептуально представляют собой некоторую относительно произвольную точку в последовательности нажатий клавиш, которая вписывалась в большую идею. Избавьтесь от них или создайте слой абстракции (merge commits), который позволяет игнорировать их, когда вы пытаетесь понять репозиторий с точки зрения идей (что почти всегда).

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

Для мерзавца, рекомендуемое решение выдвинуть полнометражных ветви в верховьях, а затем объединить, а не перебазироваться на мастер - если вы согласны с приведенными выше точками, но все еще хотите, чтобы ваша контрольная точка совершает в вышестоящий.

Если это только во время просмотра (как ваш вопрос сформулирован), но это также звучит так, будто вы не просматриваете код или не проверяете только пост-push-код с помощью Audit), обратите внимание, что Differential будет отображать все ваши локальные совершает запись с оригинальным сообщением фиксации для просмотра рецензента.

arc land предназначен для использования только для «окончательной» ветви репозитория (то есть производства или какой-либо ветви, представляющей изменения, ожидающие освобождения). Если вы выполняете проверку пост-push-фиксации (т. Е. О слияниях от разработки к главному), вы можете просто обходить arc land (и обычно считается, что вам нужно во многих случаях) и git push ваши изменения напрямую.

+4

Для сквош-коммит является противоположностью «одной идеи за фиксацию». Он формирует «мегакоманды», которые нельзя отменить, легко передать или обсудить. Это серьезно мешает git bisect и git винить. Используйте правильные ветви, если вы хотите собрать несколько коммитов в одну точку слияния. –

+1

Все, что вы сказали, подразумевает, что вы слишком много сокрушаетесь. Скрининг контрольных точек - это, безусловно, не противоположность «одной идеи за совершение». Пожалуйста, прочитайте связанный источник, если вы хотите больше контекста. – asherkin

+1

Итак, теперь я вижу, что связанная статья определяет «одну идею» таким образом, что я бы назвал «много идей». Я согласен с этим: одно обязательство должно быть одним конкретным, легко описываемым изменением с жесткой целью. Строка коммитов может быть частью более грандиозной схемы, «функции», и это ветка. –

19

Ответ ашеркина объясняет обоснование такого поведения и почему это значение по умолчанию.

Если вы не можете найти этот аргумент убедительным, вы можете использовать --merge флаг arc land выполнять --no-ff сливает вместо --squash слияниях. Эти слияния не уничтожат локальные коммиты.

Если вы установили history.immutable в true в .arcconfig, arc land будет --no-ff слить по умолчанию.

Вы также можете использовать команды git, если вам не нравится поведение arc land; он предоставляется только для удобства.

В вашем примере мы рекомендуем создать пять отдельных отзывов - реализовано несколько различных идей, и они не связаны и кажутся легко разделяемыми. См. Writing Reviewable Code. Объединение исправлений, изменений стиля и новых функций в одно изменение - накопление.

+4

Когда я пишу код, у меня обычно есть одна задача, которую я хочу выполнить, и я разделяю ее на более мелкие задачи, которые сохраняют правильность кода, делают только одну вещь с кодовым основанием, но не нуждаются в изменении функциональности в любом значимом в одном коммите. Я ожидаю, что принятие коммита будет атомарным, что невозможно под сломанной 1-идеей = 1-commit, что * разработчики git сами не используют *. Пять отдельных обзоров подразумевают, что они представляют собой пять отдельных ветвей, которые взаимно взаимозаменяемы, если это не так в типичной серии патчей. – alternative

2

history.immutable: настраивает дуги для использования рабочих процессов, которые никогда не переписывают историю в рабочей копии. По умолчанию arc выполняет некоторую переписку неопубликованной истории (изменение сообщений фиксации, слияние сквоша) на некоторых рабочих процессах в Git. Различия подробно описаны ниже.

так просто добавить строку в .arcconfig

"history.immutable": true 
Смежные вопросы