Я хотел бы запустить пакетный файл с помощью post-commit hook в Subversion. Моя проблема заключается в том, что я хочу запустить его один раз для каждого файла, который был зафиксирован, но я не знаю, как получить имена зафиксированных файлов в пределах крюка. Я могу запустить его для каждого файла в папке, однако, когда я вышел из этой тестовой среды и на самом деле использую эту функцию, есть много разных файлов, и это будет очень неэффективно. Есть идеи??Крючки в Subversion
ответ
Мне удалось выяснить это с помощью партии и использовать временные текстовые файлы для хранения некоторых данных. Я должен был сделать некоторую обработку, чтобы получить только имя файла в переменной, так как это то, что мне нужно в качестве параметра. Это не может быть наиболее эффективным методом, но он достиг своей цели ...
setlocal EnableDelayedExpansion
rem write a list of the changed files in a text file
"C:\svnpath\bin\svn.exe" log "C:\repo-path\project" -r %TXN% --verbose > "C:\path\changelist.txt"
rem write the list of all files into a text file
cd "C:\repo-path\project"
dir /b > "C:\path\filelist.txt"
rem loop through files
cd "C:\path"
for /F "delims=" %%i IN (filelist.txt) do (
rem search for file name in list of changed files, if found run batch file on it
find /i "%%i" changelist.txt > nul
echo %%i > "C:\path\temp.txt"
if not errorlevel 1 (
cd "C:\repo-path\project"
batchfile.bat %%i
)
)
rem delete temp files when finished
del "C:\path\filelist.txt"
del "C:\path\changelist.txt"
del "C:\path\changedfiles.txt"
SVN передает на крючок два значения, путь к репозиторию и номер версии, которые были сгенерированы.
Используя эту информацию, вы можете запросить SVN путь, измененный в этой ревизии, и получить список добавленных/измененных файлов.
, но хорошо знать, что это можно сделать. .. можете ли вы предложить какую-либо помощь в том, как получить измененные файлы? У меня есть скрипт, который делает это для каждого файла в папке сейчас, если вы можете показать мне скрипт для получения исправленного или измененного файла, я бы очень признателен! :) – mgrenier
В сценарии просто вызовите svn-журнал, используя переданную ему ревизию, и вы получите полный список всего, что было изменено в commit. –
Итак, теперь я могу получить имена измененных файлов, мне интересно, могу ли я выводить их в структуру данных, такую как массив, чтобы я мог перебирать их, чтобы вызвать мой пакетный файл для каждого из них? – mgrenier
Вы сделали только один маленький ошибка: список файлов в транзакции (на стороне сервера, как крючками, выполненных на сервере) можно получить проще (и без «шума» журнала), чем svn log -v
. Это svnlook
с субкомандой changed
Образцом для пересмотра в репо (для сделки вы будете использовать -t %TXN%
)
>svnlook.exe changed -r 31 Hello
U trunk/Hello.de.txt
U trunk/Hello.en.txt
U trunk/Hello.fr.txt
Hello
является путем к хранилищу корня (не рабочей копии), вывод команды, кажется, частично как вывод svn st
, путь к файлам - относительные пути от репо-корня
Что именно делает ваш скрипт? – bahrep
Сейчас все, что он делает, это дата обновления моей рабочей копии, однако для использования кода с сторонним программным обеспечением, которое моя компания использует, ему необходимо запустить скрипт, этот скрипт должен запускаться для каждого измененного файла. Я создал пакетный файл, который позволяет запускать его как ... myscript.bat changefile.c из командной строки ... Я хотел бы запустить мой пакетный файл для каждого измененного файла – mgrenier