Я использую вспомогательные функции в моем профиле Powershell. Они достаточно просты для других языков сценариев, хотя я бы не осмелился сделать это в файлах .bat или .cmd.
Я храню файл D:\repos.config
со списком абсолютных путей всех локальных репозиториев, на которые я хочу быстро взглянуть, по трем вещам: сводка состояния, входящие изменения, исходящие изменения. В следующих примерах предполагается наличие файла с таким содержимым:
D:\repository1
D:\repository2
#D:\ignoredrepo
D:\repository3
D:\repository4
Для проверки статуса сценарий делает $results = hg -R $path st
, чтобы получить список статусов, а затем я считаю только первые символы, печатая 1 строку для пути репо и 1 строку для сводки статуса для каждого пути репозитория (если есть что показать):
----- D:\repository1
M 1 - A 1
----- D:\repository4
? 3
Для входящих / исходящих я сохраняю свой [paths]
в hgrc
каждого репозитория, так что default
всегда является репозиторием на нашем сервере, bb
- на битбакете и т. Д. Я просматриваю тот же список путей, выполняя $results = hg -R $path $type $alias --template '{rev} {node|short} {desc|firstline}\n' for each.
$ typeis either
inor
outdepending on which I've called and
$ aliasis the path alias that should be in each repo's
hgrc,
bb_default $ results, since the first 2 lines are not actual changesets. You'd probably want
{date | age} or
{date | shortdate} `в вашем шаблоне, если вы хотите отфильтровать все, что было меньше 24 часов.
Таким образом, я могу просто написать hgouts bb
в командной строке и увидеть краткий вывод. У некоторых репозиториев вообще нет определенного псевдонима, поэтому 2>$null
помогает предотвратить некоторые abort: repository bb not found!
сообщения.
----- D:\repository2
150 f7364a6f78d2 integrate FooBar
151 7a3d3d9fb0d0 fixes #1214; thingamajig wasn't getting closed
----- D:\repository4
4 dd88f00d93ff more changes to the doojiflopper
Что касается синхронизации нескольких репозиториев, я достаточно доволен TortoiseHg 2.0 и его реестром репозиториев, чтобы помочь мне делать их по одному после того, как я использую сценарий, чтобы сказать мне, какие из них мне нужно сделать. Но также было бы не так уж сложно перебирать пути и hg -R $path pull -u
или hg -R $path push
в массовом порядке или использовать фрагменты скрипта для выборочного извлечения / проталкивания только того, что необходимо, что не имеет изменений в рабочем каталоге. Просто мне это еще не нужно.
Изменить: мне потребовалось немного времени, чтобы немного почистить код. Функции hghg
- это сводка состояния, а функции hgins
[alias]
и hgouts
[alias]
- это то, что я фактически вызываю из приглашения.
function hghg(){
$repos = [io.file]::readalllines('D:\repos.config')
$repos | % {
if (!$_.startswith('#') -and (test-path $_)){
hg-st $_
}
}
}
function hg-st($path){
$x = hg -R $path st
if ($x.length -gt 0){
write-host "----- $_"
$d = @{}
$x | % {
$c = $_[0]
if (!$d.containskey($c)){
$d[$c] = 0
}
$d[$c] += 1
}
$p = @()
$d.keys | % {
$cnt = $d[$_]
$p += "$_ $cnt"
}
write-host ' ' ([string]::join(' - ', $p))
}
}
function hgins($pathalias){
hg-inouts 'in' $pathalias
}
function hgouts($pathalias){
hg-inouts 'out' $pathalias
}
function hg-inouts($type, $pathalias){
$repos = [io.file]::readalllines('D:\repos.config')
$repos | % {
if (!$_.startswith('#') -and (test-path $_)){
hg-inout $type $_ $pathalias
}
}
}
function hg-inout($type, $source, $target){
$x = hg -R $source $type $target --template '{rev} {node|short} {desc|firstline}\n' 2>$null
if ($x.count -gt 2 -and $x[2] -ne 'no changes found'){
write-host "----- $source"
$y = $x[2..($x.length - 1)]
$y | % {write-host ' ' $_}
}
}
person
Joel B Fant
schedule
17.06.2011
hg outgoing
перечислит все исходящие изменения. Но это не то, что вам нужно - вам нужен существующий инструмент, который будет отслеживать репозитории и сообщать вам, когда у вас есть исходящие изменения, которые могут устареть. - person Tom Anderson   schedule 17.06.2011