#python #svn
#svn #репозиторий
Вопрос:
Довольно часто я сижу в середине рабочей копии subversion, и я хочу сделать быстрый svn status
, чтобы узнать, какие изменения я внес с момента последней проверки. Однако svn status
работает только с текущей папкой и ее дочерними элементами. (Аналогично для svn up
тоже)
Я хотел бы быстрый способ перейти к корневой папке рабочей копии subversion, чтобы я мог запустить svn status
и просмотреть все файлы, которые были изменены, возможно, проверка или обновление, а затем вернуться к работе, где я был раньше.
Ответ №1:
Вот мой первый ответ: я написал небольшой скрипт bash под названием svnbase
:
#!/bin/bash -u
# this command outputs the top-most parent of the current folder that is still
# under svn revision control to standard out
# if the current folder is not under svn revision control, nothing is output
# and a non-zero exit value is given
parent=""
grandparent="."
while [ -d "$grandparent/.svn" ]; do
parent=$grandparent
grandparent="$parent/.."
done
if [ ! -z "$parent" ]; then
echo $parent
else
exit 1
fi
Итак, теперь я могу сделать это:
[~/work/scripts/XXX/code/speech-detection/framework]$ cd $(svnbase)
[~/work/scripts/XXX]$ svn status
? code/speech-detection/framework/output.old
[~/work/scripts/XXX]$ cd -
/home/XXXX/work/scripts/XXX/code/speech-detection/framework
[~/work/scripts/XXX/code/speech-detection/framework]$
Комментарии:
1. Следующим логическим шагом было бы интегрировать эту серию команд, которые вы вводите, в сам скрипт.
2. Если вы предпочитаете абсолютный путь, а не относительный, инициализируйте:
grandparent=$(pwd)
и каждый цикл:grandparent=$(dirname parent)
3. Это будет работать только для версий Subversion до 1.6. Версии 1.7 и более поздние имеют только одну
.svn
папку в корневой папке.4. @ccpizza Тогда, я думаю, вы могли бы просто зацикливаться, пока не найдете
.svn
папку…
Ответ №2:
В Windows:
svn info . |findstr /C:"Working Copy Root Path:"
В Linux:
svn info . |grep -F "Working Copy Root Path:"
Она может быть присвоена переменной с помощью небольшой манипуляции со строкой. Версия для Windows:
FOR /F "delims=" %%i IN ('svn info . ^|findstr /C:"Working Copy Root Path:"') DO SET SOME_TEMP_VAR=%%i
SET WORKING_COPY_ROOT=%SOME_TEMP_VAR:~24%
Комментарии:
1. Это не сработает, если текущий подкаталог в данный момент не отслеживается как часть svn. Ошибка svn: предупреждение: W155010: узел ‘C:svnrootpathtofoldernotinsvn ‘не найден.
2. В неанглоязычных системах это может привести к сбою, поскольку текст будет локализован. Чтобы предотвратить это в Linux, добавьте строку
export LC_ALL=C
в свой скрипт.
Ответ №3:
Если вы используете git-svn
в качестве клиента Subversion, то вы можете прозрачно взаимодействовать с репозиторием Subversion, используя команды Git локально. Git автоматически показывает вам ожидание во всем репозитории, когда вы используете команды типа git status
в любом месте дерева.
Ответ №4:
В Linux с svn версии 1.9.3 (r1718519) я запускаю это: svn info --show-item wc-root
Комментарии:
1. Вы имели в виду wc-root?
svn help info
это указано в качестве опции, и, похоже, она работает правильно.2. Да, это то, что я имел в виду. Я обновлю ответ.
Ответ №5:
Это невозможно. SVN может быть извлечен с любой глубины, и любой вложенный каталог действует как совершенно новая проверка.
редактировать: скрипт svnbase в предыдущем комментарии работает, но он неточный.
Комментарии:
1. Родительский каталог может быть извлечением из другого репозитория.
Ответ №6:
на самом деле, если вы заглянете в свой файл .svn /entries, вы найдете базу, указанную там, обычно в строке 6. В любом случае формат вашего svn URL даст вам несколько важных подсказок: P О да, я взял на себя смелость посмотреть, и svn info
также расскажу вам.
…вздох, это не то, что вы спрашивали. Мне нравится решение в первом ответе: P
Комментарии:
1. однако в информации svn указан корень вашего репозитория, а не рабочая копия. Таким образом, это не помогло бы, если бы вы не проверяли весь репозиторий, тогда как
svnbase
выше все равно помогло бы.
Ответ №7:
Попробуйте следующую команду на любой глубине вашей рабочей копии:
svn info . --show-item wc-root --no-newline
Ответ №8:
Вот мое решение, которое представляет собой гибрид различных решений, представленных здесь. Она написана на PowerShell, поскольку мне это было нужно для модуля PowerShell, который я пишу.
<#
This command outputs the top-most parent of the current folder.
If the current folder is not under svn revision control,
it will recurse up one level, and try again.
It stops at the root folder on the current drive.
If the current folder's drive's root folder is not under svn revision control,
it will throw an exception "No SVN Root Directory found."
#>
function Get-SvnRootDirectory {
$currentDirectory = Get-Location
do {
$output = $(svn info $currentDirectory 2> $null)
$output = $output | findstr /C:"Working Copy Root Path:"
if ($LASTEXITCODE -eq 0)
{
break;
}
# if (Test-Path -PathType Container -Path $currentDirectory)
# {
# throw "No SVN Root Directory found."
# }
$currentDirectory = Split-Path -Path $currentDirectory -Parent
if ([string]::IsNullOrWhiteSpace($currentDirectory))
{
throw "No SVN Root Directory found."
}
}
while ($true)
$output -match "Working Copy Root Path: (?<Group>.*)$" | Out-Null
return $Matches.Group
}