Легко получить признак (например, "действительно ли функция линейна? подлинейный? многочлен? экспоненциал")
трудно найти точную сложность.
, Например, вот решение Python: Вы предоставляете функцию и функцию, которая создает параметры размера N для нее. Вы возвращаете список (n, время) оценивает графику, или работать регрессионный анализ . Это времена это однажды для скорости, для получения действительно хорошего признака это имело бы ко времени его много раз для уменьшения интерференции от факторов окружающей среды (например, с модуль timeit ).
import time
def measure_run_time(func, args):
start = time.time()
func(*args)
return time.time() - start
def plot_times(func, generate_args, plot_sequence):
return [
(n, measure_run_time(func, generate_args(n+1)))
for n in plot_sequence
]
И использовать его для пузырьковой сортировки времени:
def bubble_sort(l):
for i in xrange(len(l)-1):
for j in xrange(len(l)-1-i):
if l[i+1] < l[i]:
l[i],l[i+1] = l[i+1],l[i]
import random
def gen_args_for_sort(list_length):
result = range(list_length) # list of 0..N-1
random.shuffle(result) # randomize order
# should return a tuple of arguments
return (result,)
# timing for N = 1000, 2000, ..., 5000
times = plot_times(bubble_sort, gen_args_for_sort, xrange(1000,6000,1000))
import pprint
pprint.pprint(times)
Это распечатало на моей машине:
[(1000, 0.078000068664550781),
(2000, 0.34400010108947754),
(3000, 0.7649998664855957),
(4000, 1.3440001010894775),
(5000, 2.1410000324249268)]
Вы можете использовать git cherry pick только для слияния выбранных вами патчей. Просто выберите каждый коммит, кроме локального, в главную ветку.
Поместите файл css в общедоступную папку. Это потребует изменения в вашем web.config, который будет выглядеть примерно так:
<location path="css">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
Конечно, это не должно быть способом установки разрешений в первую очередь. Папка css всегда должна быть общедоступной.
которые я хочу объединить Не забывайте, что вы можете связать любой сценарий для управления этими объединениями с помощью атрибутов git
. Это включает в себя сценарий, способный сохранять изменения, которые вы хотите, локально, при объединении остальных. Сложнее написать такой «менеджер слияния», но это путь к специализированному автоматизированному решению.
Менее техническим решением было бы отделить значения конфигурации от файлы конфигурации :
Сценарий используется для замените имя в фактическом файле конфигурации на значения одного из файлов значений конфигурации, необходимых для данной среды.
Это включает в себя сценарий, способный сохранять изменения, которые вы хотите, локально, при объединении остальных. Сложнее написать такой «менеджер слияния», но это путь к специализированному автоматизированному решению.Менее техническим решением было бы отделить значения конфигурации от файлы конфигурации :
Сценарий используется для замените имя в фактическом файле конфигурации на значения одного из файлов значений конфигурации, необходимых для данной среды.
Это включает в себя сценарий, способный сохранять изменения, которые вы хотите локально, при объединении остальных. Сложнее написать такой «менеджер слияния», но это путь к специализированному автоматизированному решению.Менее техническим решением было бы отделить значения конфигурации от файлы конфигурации :
Сценарий используется для замените имя в фактическом файле конфигурации на значения одного из файлов значений конфигурации, необходимых для данной среды.
Я бы сделал интерактивную перебазировку для мастера и переместил ваш путь-имя-исправление-фиксация в конец. Затем вы можете объединиться до этого момента. Просто продолжайте перемещать ваш специальный коммит до конца.
Вы также можете найти тайник полезным. Вместо того, чтобы фактически фиксировать исправления имени пути, вы можете спрятать их. Если вы попробуете этот подход, вы можете проверить вопрос на Как отменить применение тайника .
Что ж, поскольку до сих пор нет ответа, предлагающего прямое решение, я предполагаю, что то, что я хочу сделать, невозможно, и добавляю к куче иногда полезных решений:
Если вы ' Если вы всегда разрабатываете ветку features
, вы можете объединить features
с master
, а затем в master
, git восстановить локальный
. (Где local
- это тег, ссылающийся на фиксацию, в которой вы настроили пути и т. Д. Для вашей локальной среды.)
Теперь вы никогда не должны объединять master
с функциями
], потому что это также объединит обратный локальный
коммит.
В этом случае master
становится своего рода ветвью развертывания, только когда-либо получая слияния из других ветвей. (Идеально, только из ветки features
.)
Это очень легко идет под откос, просто добавьте еще одного разработчика в рабочий процесс, и все станет действительно беспорядочно. По-прежнему можно обойтись с помощью явных стратегий слияния, но обычно это неудобно.
ок. не гарантируется, что это будет работать каждый раз, но что-то вроде этого может сработать (и в тех случаях, когда этого не произойдет, у вас все равно будут конфликтующие изменения, которые необходимо разрешить):
при выполнении слияния с мастером:
rebase -i master
из вашей ветки и переместить изменение только локально в END цепочки исправлений. 1263] разрешить любые конфликты в процессе. Если в конфигурационных файлах есть только локальные изменения, и вы не касаетесь их в ходе обычной разработки, у вас не будет проблем. Если, в противном случае, у вас действительно есть конфликт, то это тот случай, когда вы действительно меняете в той же области, и он требует вашего внимания, чтобы все равно разрешить. merge your local-branch -1:
Я не знаю, сработает ли это, но:
MAKE_LOCAL
MAKE_REMOTE
git cherry-pick MAKE_REMOTE
(или используйте git diff
и патч
) git cherry-pick MAKE_LOCAL
(или используйте git diff
и patch
) Я думаю, что есть еще лучший способ преобразования файлов таким образом, но я не могу вспомнить (если вы можете найти Shacon's git из RubyConf и может пролистать 800 слайдов, там есть несколько отличных примеров).
My solution to this problem uses rebase rather than merge
Starting with a commit tree like this:
a-b-c <-- master
\
d <-- local
\
e-f-g <-- dev
$ git rebase --onto master local dev
master
V
a-b-c-e'-f'-g' <-- dev
\
d <-- local
$ git checkout master
$ git merge dev
master
V
a-b-c-e'-f'-g' <-- dev
\
d <-- local
$ git rebase --onto master master local
master
V
a-b-c-e'-f'-g' <-- dev
\
d' <-- local
$ git branch -f dev local
master
V
a-b-c-e'-f'-g'
\
d' <-- local
^
dev
Лично, если бы мне пришлось сделать что-то подобное и мне по какой-либо причине не позволили рефакторинг учетных данных на моем пути, я бы добавил еще две ветки, в результате получилось бы расположение, подобное следующему:
master
: исходный код, который вы унаследовали
localcred
: ответвление от мастера, и добавьте только один патч, который изменяет все учетные данные на то, что вам нужно локально. В дальнейшем рассматривайте эту ветку как доступную только для чтения (и, возможно, добавьте ловушку для предотвращения случайных коммитов).
особенность
: ответвление от мастера, и все исправления идут сюда (и, возможно, добавить ловушку для предотвращения слияния с патчем в localcred)
local
: ветка (не тег!), Которая будет начните как ветвь localcred
, а затем используйте функцию слияния всякий раз, когда вам нужно запускать свои модульные тесты. Отсюда происходит все тестирование, но здесь не происходит разработки. Кроме того, эта ветка является одноразовой, потому что вы можете захотеть перебазировать внутри feature
, и самый быстрый способ справиться с результатом будет - удалить ветку local
, затем снова разветвить ее из localcred
и объедините функцию
перед запуском ваших тестов. Скорее всего, это будет достаточно распространенная операция в моем рабочем процессе, и я бы создал псевдоним, чтобы делать это многократно всего несколькими нажатиями клавиш, но я чертовски стараюсь избавиться от веток Git, что пугает некоторых людей, которые смотри на меня, так что YMMV.
Когда вы считаете, что ваши исправления готовы к публикации, вы делаете окончательную перебазировку функции
, чтобы очистить историю, создать дамп и воссоздать локальный
для вашего финального теста, объедините ] функцию
в master
, и как только она будет принята в восходящем направлении, объедините master
с localcred
и переустановите свой патч учетных данных в начало, затем сделайте дамп и воссоздайте local
и функция
и играйте заново.
Если вы хотите быстро протестировать большой набор крошечных вариантов кода без необходимости каждый раз фиксировать и объединять, проверяйте local
, вносите изменения до тех пор, пока не будете довольны, зафиксируйте и немедленно приступайте к работе. выберите из локальный
в компонент
, затем удалите и воссоздайте локальный.
Удовлетворяет ли это ваши потребности?