Sub Git: Git перехватывает, чтобы заблокировать svn-файл, если он не заблокирован, или отклонить коммит, если заблокирован другим пользователем - PullRequest
0 голосов
/ 01 апреля 2020

Контекст:

Я работаю над большим проектом UE4. В настоящее время мы используем SVN в качестве нашей VCS, но я всегда был git разработчиком, и у меня нет желания терять локальные репозитории, локальные ветки и тайники.

Итак, Я начал использовать Sub Git для работы с git версией репо, в то время как sub git выполняет преобразование git в svn. Пока мне это нравится, за исключением того факта, что я вынужден использовать ребаз вместо слияния, все остальное как обычно git.

РЕДАКТИРОВАТЬ 1: мой саб git репо только локальный, так как у меня нет доступа к удаленному репозиторию SVN. Это означает, что такие инструменты, как svnadmin или svnlook не работают для меня.

Вопрос:

Теперь моя команда работает, блокируя двоичный файл файлы, с которыми они работают в SVN. Я хочу автоматизированный c способ присоединиться к этому рабочему процессу. Поэтому я подумал о хуке предварительной фиксации, чтобы проверить, заблокированы ли файлы, которые я собираюсь зафиксировать. Если нет, то немедленно заблокируйте их. Если это так, проверьте, не являюсь ли я владельцем замка. Если нет, прервите коммит.

Есть ли у кого-нибудь подсказки, как добиться чего-то подобного?

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

После долгих исследований методом проб и ошибок наконец-то получилось то, что РАБОТАЕТ !! 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

Супер открыт для улучшений! Пожалуйста, предложите их в комментариях

0 голосов
/ 01 апреля 2020

Что касается блокировки, вы можете использовать « Каков наилучший способ увидеть, какие файлы заблокированы в Subversion? », что означает svnadmin lslocks, в котором перечислены заблокированные файлы и их владельца , (также, локально, svn status --show-updates)

Сравните это в вашей ловушке предварительной фиксации со списком, заданным git diff --cached --name-status.
Для любого файла, не заблокированного, svn proplist -v будет отображать его владельца.

...