2009-12-12 241 views
4

我们希望使用OpenGrok为我们的(相当大的)git仓库集合编制索引,而我一直无法弄清楚的是如何索引所有分支。从我所看到的情况来看,它似乎需要检出我想要索引的每个分支的副本,因此,如果存储库有十几个分支,我需要有十几个副本,一个对于每个分支,例如,如何处理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在创建索引时查看全部分支?

+0

这是4岁。是否有任何修改OpenGrok会在此期间改变答案? – 2014-05-08 20:10:10

+1

据我所知,没有。 – ebneter 2014-05-08 20:52:14

回答

7

在OpenGrok其他层被设计为在多个SCM系统并不像git的携手,所以很遗憾你你有你想要的每个分支作为一个单独的git仓库检查出指数:-(

你总可以提起RFE支持在一个Git仓库中浏览多个分支。

+1

啊,无赖。不过谢谢你的回答! – ebneter 2009-12-14 08:30:20

-2

我不知道OpenGrok什么,但你当然可以用改变分支机构的Git:

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

问题是,据我所知,OpenGrok本身并不知道如何做到这一点。 – ebneter 2009-12-13 07:29:50

0

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

0

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

sudo crontab -e 

然后粘贴这些内容:

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

然后写入和关闭:

:wq 

您需要安装脚本用来输入ssh密钥的密码的“expect”。

sudo yum install expect 
sudo apt-get install expect 

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

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

接下来,粘贴在单这两个命令将根据您所使用的Linux操作系统工作脚本的内容(从这篇文章的底部),并根据您的系统更改顶部的变量。接下来,更改权限,以便只有root可以读它(它有它的密码):

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

你可能想测试手动运行该脚本,并得到它的工作,期待cron作业工作之前。这是我写的我的特别设置一个特定的脚本,所以你可能需要把一些回声报表,并做一些调试以达到正常工作:

sudo /usr/local/bin/opengrok_index.sh 

其他注意事项:

  • 这脚本通过SSH(不是HTTPS)登录到GIT。因此,您的系统上必须存在您的GIT_USER,并且在拥有访问GIT仓库的 /home/user/.ssh/id_rsa下有SSH密钥。这是标准GIT登录内容的 ,所以我不会在这里重述。该脚本将 进入GIT_USER_SSH_PASSWORD当提示
  • 脚本检查出所有的文件GIT_USER,所以你可能需要“CHOWN”你CHECKOUT_LOCATION到用户

脚本:

#!/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="[email protected]" 

    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