gitlab-ce 12.X:我如何找到服务器上存储库的散列存储路径?

qcuzuvrc  于 2022-12-25  发布在  Git
关注(0)|答案(3)|浏览(202)

使用gitlab-ce-12.x时,Geo要求对存储路径进行散列(https://docs.gitlab.com/ee/administration/repository_storage_types.html
因此,对于给定的存储库,数据将存储在:“@散列/#{散列[0..1]}/#{散列[2..3]}/#{散列}.git”
从实际的Angular 来看,假设我有一个存储库,其URL为
https://my-gitlab-server/Group1/project1.git
如何计算出到服务器上存储的路径?即,如何找到的值
第一个月
谢啦,谢啦

erhoui1w

erhoui1w1#

我找到问题的答案了。
为了获得项目的散列存储位置,您首先需要获得项目存储库的项目ID。
一旦你得到了这个项目id,假设你的项目id是1,你就得到了如下的哈希值:
Say project.id is 1
回声-n 1|沙256苏姆
=〉您将得到哈希值6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
因此,存储库在服务器上的散列存储位置将是:
服务器/@散列/6b/86/6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b.git
gitlab开发人员已经在https://gitlab.com/gitlab-org/gitlab-ce/issues/63250中讨论过这个问题

kyxcudwk

kyxcudwk2#

正如@iclman所描述的那样,从documented开始,您就可以根据项目ID的sha 256散列来计算散列存储路径。

proj_id = '<PROJECT_ID>'
hash = Digest::SHA2.new(256).hexdigest proj_id
"/var/opt/gitlab/git-data/repositories/@hashed/#{hash[0..1]}/#{hash[2..3]}/#{hash}.git"

或者使用shell函数(bash/zsh):

get-gitlab-project-path() {
    PROJECT_HASH=$(echo -n $1 | openssl dgst -sha256 | sed 's/^.* //')
    echo "/var/opt/gitlab/git-data/repositories/@hashed/${PROJECT_HASH:0:2}/${PROJECT_HASH:2:2}/${PROJECT_HASH}.git"
}

贝壳功能:

function get-project-path --description 'Print the GitLab hashed storage path of a project ID'
  set PROJECT_HASH (echo -n $argv[1] | openssl dgst -sha256 | string trim)
  set B1 (string sub --start=1 --length=2 $PROJECT_HASH)
  set B2 (string sub --start=3 --length=2 $PROJECT_HASH)
  set HASHED_DIR "/var/opt/gitlab/git-data/repositories/@hashed"
  echo $HASHED_DIR/$B1/$B2/$PROJECT_HASH.git
end
de90aj5v

de90aj5v3#

相反的方向看起来更容易(告诉哪个repo属于一个已知的路径)。Gitlab在repo中存储"Gitlab路径",称为fullpath,例如:

cat /var/opt/gitlab/git-data/repositories/@hashed/ff/2c/ff2ccb6ba423d326bd549ed4cfb76e96976a0dcde05a01996a1cdb9f83422ec4.git/config

输出:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = true
[gitlab]
    fullpath = mygroup/myproject

如果你没有太多的回购协议,你可以把它们都看一遍,然后做一个Map:

for GITDIR in $(find /var/opt/gitlab/git-data/repositories/@hashed/ -maxdepth 3 -type d -name '*[0-9a-f].git'); do
   echo "$(cat ${GITDIR}/config | grep fullpath | awk -F " = " '{print $2}')   $GITDIR"
done

输出是一个gitlab路径-dir路径对格式的所有repos列表(除了wiki)。
例如:

mygroup/myproject   /var/opt/gitlab/git-data/repositories/@hashed/ff/2c/ff2ccb6ba423d326bd549ed4cfb76e96976a0dcde05a01996a1cdb9f83422ec4.git

ps:我现在有~150个repos,这个小脚本很快就完成了(~半秒)

相关问题