如何在OpenGrok中处理git分支?

时间:2009-12-12 00:01:00

标签: git opengrok

我们希望使用OpenGrok索引我们(相当大的)git存储库集合,而我无法弄清楚的一件事是如何索引所有分支。从我所看到的,看起来我需要签出我想要索引的每个分支的副本,所以,如果一个存储库有十几个分支,我需要有十几个分支,一个对于每个分支,例如,

git-repo-with-many-branches-master/
git-repo-with-many-branches-branch1/
git-repo-with-many-branches-branch2/
       :
git-repo-with-many-branches-branch12/

这是真的吗?或者有没有办法告诉OpenGrok在创建索引时查看所有分支?

4 个答案:

答案 0 :(得分:7)

OpenGrok中的其他层设计用于多个不像git一样工作的SCM系统,所以不幸的是,你必须检查你想要索引的每个分支作为一个单独的git存储库: - (

您可以随时提交RFE以支持浏览git存储库中的多个分支。

答案 1 :(得分:0)

我为此专门编写了一个脚本:daun。您需要在cron作业中使用daun cli而不是git cli。请注意,在撰写本文时它不支持OpenGrok git历史记录,因为我们只对OpenGrok快速搜索功能感兴趣。我们会将OpenGrok用户指向GitHub / Bitbucket这样的工具,用于基于Web的git历史记录。

答案 2 :(得分:0)

这是我为此做的一个bash脚本。它将克隆任何新分支,更新任何现有分支,并删除不再存在的分支。以下是“工作”的说明;您可以选择使事情更安全,但如果您的服务器只能在您的LAN上访问,这就足够了。我有一个cron作业设置,只需在服务器上每30分钟运行一次。要将cron作业设置为以root身份运行,请运行:

sudo crontab -e

然后粘贴这些内容:

*/30 * * * * /usr/local/bin/opengrok_index.sh

然后写下并关闭:

:wq

您需要安装脚本用来输入ssh密钥密码的“expect”。根据您使用的Linux操作系统,这两个命令中的一个将起作用:

sudo yum install expect
sudo apt-get install expect

然后在/usr/local/bin/opengrok_index.sh中创建一个文件:

sudo vi /usr/local/bin/opengrok_index.sh

接下来,粘贴脚本的内容(从这篇文章的底部),并根据您的系统更改顶部的变量。接下来,更改权限,以便只有root可以读取它(它有密码):

sudo chmod 700 /usr/local/bin/opengrok_index.sh

您可能希望在期望cron作业工作之前,手动测试运行脚本并使其正常工作。这是我为特定设置编写的特定脚本,因此您可能需要输入一些echo语句并进行一些调试以使其正常工作:

sudo /usr/local/bin/opengrok_index.sh

附加说明:

  • 此脚本通过SSH(不是HTTPS)登录到GIT。就这样,你的 GIT_USER必须存在于系统上,并且具有SSH密钥 /home/user/.ssh/id_rsa可以访问GIT仓库。这是 标准GIT登录的东西所以我不会在这里讨论它。脚本会 提示时输入GIT_USER_SSH_PASSWORD
  • 该脚本将所有文件检出为GIT_USER,因此您可能需要将CHECKOUT_LOCATION“chown”给该用户

脚本:

#!/bin/bash

SUDO_PASSWORD="password"
CHECKOUT_LOCATION="/var/opengrok/src/"
GIT_PROJECT_NAME="Android"
GIT_USER="username"
GIT_USER_SSH_PASSWORD="password"
GIT_URL="yourgit.domain.com"
OPENGROK_BINARY_FILE="/usr/local/opengrok-0.12.1.6/bin/OpenGrok"

# Run command as GIT_USER which has Git access
function runGitCommand {
  git_command="$@"

  expect_command="
    spawn sudo -u $GIT_USER $git_command
    expect {
        \"*password for*\" {
            send \"$SUDO_PASSWORD\"
            send \"\r\"
            exp_continue
        }
        \"*Enter passphrase for key*\" {
            send \"$GIT_USER_SSH_PASSWORD\"
            send \"\r\"
            exp_continue
        }
    }"

  command_result=$(expect -c "$expect_command" || exit 1)
}

# Checkout the specified branch over the network (slow)
function checkoutBranch {
  branch=$1

  # Check out branch if it does not exist
  if [ ! -d "$branch" ]; then
    runGitCommand git clone ssh://$GIT_URL/$GIT_PROJECT_NAME
    # Rename project to the branch name
    mv $GIT_PROJECT_NAME $branch || exit 1
  # Otherwise update the existing branch
  else
    cd $branch || exit 1
    runGitCommand git fetch
    runGitCommand git pull origin $branch || exit 1
    cd ..
  fi
}

# If the branch directory does not exist, copy the master
# branch directory then switch to the desired branch.
# This is faster than checkout out over the network.
# Otherwise, update the exisiting branch directory
function updateBranch {
  branch=$1

  if [ ! -d "$branch" ]; then
    mkdir $branch || exit 1
    rsync -av master/ $branch || exit 1
    cd $branch || exit 1
    runGitCommand git checkout -b $branch origin/$branch
    cd ..
  else
    cd $branch || exit 1
    runGitCommand git pull origin $branch || exit 1
    cd ..
  fi
}

# Change to the OpenGrok indexing location to checkout code
cd $CHECKOUT_LOCATION || exit 1

# Check out master branch
checkoutBranch master

# Get a list of all remote branches
cd master || exit 1
old_ifs=$IFS
IFS=$'\n'
origin_branches=( $(git branch -r) )
IFS=$old_ifs
origin_branches_length=${#origin_branches[@]}
cd .. # Move out of "master" directory

# Loop through and check out all branches
branches=(master)
for origin_branch in "${origin_branches[@]}"
do
  # Strip the "origin/" prefix from the branch name
  branch=${origin_branch#*/}

  # Ignore the "HEAD" branch
  # Also skip master since it has already been updated
  if [[ $branch == HEAD* ]] || [[ $branch == master* ]]; then
    continue
  fi

  branches+=("$branch")
  updateBranch $branch
done

# Get list of branches currently in OpenGrok
old_ifs=$IFS
IFS=$'\n'
local_branches=( $(ls -A1) )
size=${#local_branches[@]}
IFS=$old_ifs

# Get list of branches that are in OpenGrok, but do not exist
# remotely. These are branches that have been deleted
deleted_branches=()
for local_branch in "${local_branches[@]}"
do
  skip=0

  for branch in "${branches[@]}"
  do
    if [[ $local_branch == $branch ]]; then
      skip=1;
      break;
    fi
  done

  if [[ $skip == "0" ]]; then
    deleted_branches+=("$local_branch")
  fi
done

# Change to checkout directory again, in case some future code
# change brings us somewhere else. We are deleting recursively
# here and cannot make a mistake!
cd $CHECKOUT_LOCATION
# Delete any branches that no longer exist remotely
for deleted_branch in ${deleted_branches[@]}
do
  rm -rf ./$deleted_branch
done

# Reindex OpenGrok
$OPENGROK_BINARY_FILE index

答案 3 :(得分:-3)

我对OpenGrok一无所知,但当然你可以使用Git更改分支:

git checkout master
# do the indexing here
git checkout branch1
# indexing
git checkout branch2
# and so on...