繁体   English   中英

SubGit:如果未锁定,则 Git 钩子锁定 svn 文件,如果被其他用户锁定,则拒绝提交

[英]SubGit: Git hook to lock a svn file if non locked, or reject commit if locked by another user

语境:

我正在处理一个大型 UE4 项目。 目前我们使用 SVN 作为我们的 VCS,但我一直是一名 git 开发人员,拥有本地仓库、本地分支和隐藏是我不愿意丢失的东西。

所以,我已经开始使用 SubGit 来处理 repo 的 git 版本,而 subgit 执行 git 到 svn 的转换。 到目前为止,我喜欢它,除了我被迫使用 rebase 而不是合并这一事实之外,其他一切都像普通的 git。

编辑 1:我的 subgit 存储库是本地的,因为我无权访问远程 SVN 存储库。 这意味着像svnadminsvnlook这样的工具对我不起作用。

题:

现在,我的团队通过锁定他们在 SVN 中处理的二进制文件来工作。 我想要一种自动加入该工作流程的方式。 所以我想到了一个预提交钩子来检查我要提交的文件是否被锁定。 如果没有,则立即锁定它们。 如果是,请检查我是否是锁的所有者。 如果不是,请中止提交。

有没有人有任何关于如何实现这样的事情的线索?

经过大量研究,反复试验终于得到了一些可行的东西!! 😀我添加了所有这些评论,所以人们可以理解我的逻辑,因为我仍然相信它可以改进。

编辑 1:创建了一个 gist 来托管文件,以跟踪对其进行的任何改进pre-commit gist

例如,我每个文件访问一次远程仓库。 当往返时间很长时,如果提交包含多个 .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

超级开放改进! 请在评论中推荐它们

关于锁定,您可以使用“查看 Subversion 中锁定哪些文件的最佳方法是什么? ”,意思是svnadmin lslocks列出锁定的文件及其所有者。 (另外,在本地, svn status --show-updates

在你的pre-commit hook中将它与git diff --cached --name-status给出的列表进行git diff --cached --name-status
对于任何未锁定的文件, svn proplist -v将显示其所有者。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM