Как сравнить два git-репозитория?

Чтобы приостановить очередь отправки, это просто dispatch_suspend(queue) в Objective-C или Swift 2.3 или queue.suspend() в Swift 3. Это не влияет на какие-либо запущенные в данный момент задачи, а просто предотвращает запуск новых задач в этой очереди , Кроме того, вы, очевидно, только приостанавливаете очереди, которые вы создали (а не глобальные очереди, а не главную очередь).

Чтобы возобновить очередь отправки, это dispatch_resume(queue) в Objective-C или Swift 2.3 или queue.resume() в Swift 3. Нет понятия «авто возобновление», поэтому вам просто нужно вручную возобновить его, когда это необходимо.

Чтобы передать очередь отправки, вы просто передаете объект dispatch_queue_t, который вы создали когда вы вызывали dispatch_queue_create() в Objective-C или Swift 2.3, или в Swift 3, объект DispatchQueue, который вы создаете с помощью DispatchQueue(label:) .

С точки зрения отмены задачи, поставленные в очередь на очереди отправки, это новая функция iOS 8, и вы вызываете dispatch_block_cancel(block) с вашим объектом dispatch_block_t в Objective-C или Swift 2.3 или item.cancel() в DispatchWorkItem в Swift 3. Это отменяет блоки / элементы в очереди, которые еще не запущены, но не останавливают выполняемые. Если вы хотите прервать отправленный блок / элемент, вам необходимо периодически проверять dispatch_block_testcancel() в Objective-C и Swift 2.3 или item.isCancelled в Swift 3.

Отмена блоков GCD достаточно сложна, чтобы я мог ссылаться на видео WWDC 2014 Power, Performance и Diagnostics: что нового в GCD и XPC , в котором представлена ​​информация о вас к концепции объектов блока отправки, их очереди, их отмены и т. д. Хотя это описывает более старый API Objective-C и Swift 2.3, все концепции в равной степени применимы к новому API Swift 3.

Если вы хотите отменить задачи, вы можете также рассмотреть возможность использования очередей операций NSOperationQueue в Objective-C или Swift 2.3, ака OperationQueue в Swift 3, поскольку его отменяемые операции были вокруг в то время как вы, вероятно, найдете множество примеров в Интернете. Он также поддерживает ограничение степени параллелизма с maxConcurrentOperationCount (тогда как с диспетчерскими очередями вы можете выбирать только между последовательными и параллельными и управлять параллелизмом больше, чем требует крошечных усилий с вашей стороны).

При использовании очередей операций вы приостанавливаете и возобновляете, изменяя свойство suspended очереди. И чтобы передать это, вы просто передаете объект NSOperationQueue, который вы создали.


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


В ваших комментариях вы упомянете, что вы использовали NSTimer, aka Timer в Swift 3. Если вы хотите остановить таймер, вызовите timer.invalidate() , чтобы остановить его. Создайте новый NSTimer, когда вы хотите запустить его снова.

Или, если таймер действительно работает в фоновом потоке, таймеры GCD делают это намного более изящно, избегая глупости необходимости создания runloop на фоновом потоке, который вам нужно запустить NSTimer в фоновом потоке. С помощью таймера GCD вы можете приостановить / возобновить его, как если бы вы приостановили / возобновили очередь, просто используя объект таймера вместо объекта очереди.

29
задан Brian 26 March 2009 в 20:33
поделиться

5 ответов

Почему не только кошка журнал мерзавца каждого repo в его собственный файл и выдерживают сравнение? Различие, самое близкое к нижней части файла, - то, где они начали отличаться...

18
ответ дан 28 November 2019 в 01:08
поделиться

Так как два репозитория мерзавца начинают то же, можно вытянуть обоих в тот же рабочий репозиторий.

$ git remote add cvsimport-a git://.../cvsimport-a.git
$ git remote add cvsimport-b git://.../cvsimport-b.git
$ git remote update
$ git log cvsimport-a/master..cvsimport-b/master  # in B, not in A?
$ git log cvsimport-b/master..cvsimport-a/master  # in A, not in B?
34
ответ дан 28 November 2019 в 01:08
поделиться

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

6
ответ дан 28 November 2019 в 01:08
поделиться

В одном из Ваших repos сделайте следующее:

$ git remote add other-repo git://.../other-repo.git
$ git remote update
$ git log other-repo/master...master
  # or maybe:
$ gitk master... other-repo/master

Это дает Вам симметричное различие между двумя repos; это показывает Вам все фиксации, которые находятся в одном repo, но не другом.

12
ответ дан 28 November 2019 в 01:08
поделиться

Можно поместить (выбирают) оба репозитория в единый репозиторий, или новый или один из существующих, как в ответах ephemient, Charles Bailey и Brian Campbell. Или можно использовать прием от страницы Tips и Tricks на Мерзавце Wiki, или быть более точными, "Как сравнить два локальных репозитория" вопрос там.

Но могло бы быть более просто генерировать список SHA-1 фиксаций в топологическом порядке с помощью "список версии мерзавца" (или "журнал мерзавца" с подходящими вариантами) и проверить первый пересмотр, они отличаются.

0
ответ дан 28 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: