После долгих исследований методом проб и ошибок наконец-то получилось то, что РАБОТАЕТ !! Added Я добавил все эти комментарии, чтобы ppl мог понимать мою логику c, поскольку я все еще верю, что ее можно улучшить.
РЕДАКТИРОВАТЬ 1: создал суть для размещения файла, чтобы отслеживать любые * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '' '' '' '' '' '' '' '' '' '' '' '' - " При длительной передаче туда и обратно это неэффективно, если коммит содержит несколько файлов .uasset. Вместо этого было бы здорово, чтобы пакетный запрос информации о файлах был выполнен по одному запросу SVN. Я не знаю, возможно ли это.
Кроме того, способ, которым я хватаю имя пользователя владельца блокировки, слишком хакерский, но, по крайней мере, он подходит для моего случая. Не удалось получить строку из двух одинарных кавычек во втором grep. Вместо этого я сопоставляю шаблон имени пользователя, который, конечно, работает только в моем сценарии, где все имена пользователей SVN, используемые в моей компании, имеют форму name.lastname
### Parameters
# Change SVN_USER to the SVN username you configured in subgit
SVN_USER="Firstname.Lastname"
# Remote url. Should end with trunk/ or branches/ . Assumes same folder name on svn and git
SVN_REPO="https://url/path/to/remote/trunk/"
# Currently only checks locks for files with .uasset extension
GREP_FILE_PATTERN_TO_INSPECT="\.uasset$"
# Pattern to match usernames other than your own on the lock error msg
GREP_USERNAME_PATTERN="[[:alpha:]]\+\.[[:alpha:]]\+"
### Start of the hook
# Only to be used for the lock msg. Not necessary...
CURRENT_BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
# leave as 0, used for aborting the commit if a non-owned lock is found
COMMIT_SHOULD_FAIL=0
# Array of relative file paths (to git project) from staged files that should be locked
FILES_TO_LOCK=$(git diff --cached --name-only | grep $GREP_FILE_PATTERN_TO_INSPECT)
for FILE in $FILES_TO_LOCK
do
PATH_TO_FILE_IN_SVN=$SVN_REPO$FILE
# Try to apply a lock. If the file is already locked, grab the lock owner's username
# 2>&1 redirects stderr to stdout, to pipe the error msg into grep for parsing it
# 1st grep would grab part of the error msg printed if the file is already locked
# 2nd grep would grab the lock owner's username with format GREP_USERNAME_PATTERN
LOCK_OWNER=$(svn lock $PATH_TO_FILE_IN_SVN -m "working on ${CURRENT_BRANCH_NAME}" 2>&1 \
| grep -o "already locked by user .\+'" \
| grep -o $GREP_USERNAME_PATTERN)
if [ $LOCK_OWNER ] && [ $LOCK_OWNER != $SVN_USER ] # If someone else locked it
then
echo "Error: File ${FILE} locked by ${LOCK_OWNER}"
COMMIT_SHOULD_FAIL=1
fi
done
if [ $COMMIT_SHOULD_FAIL -eq 1 ] # If at least 1 file was locked by another user
then
echo '--Commit ABORTED--'
exit 1 # Exiting with exit-code 1 makes the entire commit process abort
fi
Супер открыт для улучшений! Пожалуйста, предложите их в комментариях