Скрипт Groovy Hook GitBlit PullCommand не работает

Я ищу ЛЮБУЮ помощь с этим. У меня настроен gitblit, я использовал слегка модифицированную версию одного из скриптов groovy hooks. Мне нужен скрипт-ловушка, который развертывает голову в папку, которую затем можно использовать в качестве веб-сайта для этого сайта в WAMP. По сути, изменения будут отправлены на gitblit, и скрипт развернет эти изменения на нашем сервере разработки без какого-либо ручного вмешательства. У меня это работало над подрывной деятельностью, с простым обновлением svn на рабочей копии в качестве веб-рута. Gitblit не кажется таким простым.

Если папка клона уже существует, я хочу, чтобы она выполняла команду Pull на мастере. Код клона работает правильно и успешно создает клон репозиториев. Но затем, когда я вношу больше изменений, а клон существует, он выдает эту ошибку:

groovy.lang.MissingMethodException: No signature of method: static org.eclipse.j
git.api.Git.pull() is applicable for argument types: () values: []

Полный заводной скрипт ниже. Я немного новичок в groovy и не использовал java должным образом в течение многих лет, поэтому любая помощь даст вам богоподобный статус. Заранее спасибо.

import com.gitblit.GitBlit
import com.gitblit.Keys
import com.gitblit.models.RepositoryModel
import com.gitblit.models.TeamModel
import com.gitblit.models.UserModel
import com.gitblit.utils.JGitUtils
import com.gitblit.utils.StringUtils
import java.text.SimpleDateFormat
import org.eclipse.jgit.lib.Repository
import org.eclipse.jgit.lib.Config
import org.eclipse.jgit.api.*;
import org.eclipse.jgit.api.errors.*;
import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.FileUtils
import org.slf4j.Logger

// Indicate we have started the script
logger.info("Deploying website (In Repository ${repository.name}) for ${user.username}")

def rootFolder = 'C:/Program Files/wamp/www/git-repositories'
def bare = false
def cloneAllBranches = true
def cloneBranch = 'refs/heads/master'
def includeSubmodules = true

def repoName = repository.name
def destinationFolder = new File(rootFolder, StringUtils.stripDotGit(repoName))
def srcUrl = 'file://' + new File(gitblit.getRepositoriesFolder(), repoName).absolutePath

// if there is already a clone
if (destinationFolder.exists()) {
    PullCommand cmd = Git.pull();
}
else
{
    // clone the repository
    logger.info("cloning ${srcUrl} to ${destinationFolder}")
    CloneCommand cmd = Git.cloneRepository();
    cmd.setBare(bare)
    if (cloneAllBranches)
        cmd.setCloneAllBranches(true)
    else
        cmd.setBranch(cloneBranch)
    cmd.setCloneSubmodules(includeSubmodules)
    cmd.setURI(srcUrl)
    cmd.setDirectory(destinationFolder)
    Git git = cmd.call();
    git.repository.close()

    // report clone operation success back to pushing Git client
    clientLogger.info("${repoName} cloned to ${destinationFolder}")
}

ОБНОВЛЕНИЕ: ошибок больше нет, но ни одно из изменений, похоже, не вносится в клонированные репозитории:

logger.info("Development clone already exists, pulling changes...")

def cloneLocation = rootFolder + "/" + StringUtils.stripDotGit(repoName) + "";

FileRepository repo = new FileRepository("C:/Program Files/wamp/www/git-repositories/brightercreative.dev");

Git git = new Git(repo); 

logger.info("Pulling changes from "+cloneLocation )

git.pull();  

git.repository.close();

logger.info("Pulled changes "+cloneLocation )

person verenion    schedule 12.03.2014    source источник
comment
Какая строка выдает ошибку?   -  person tim_yates    schedule 12.03.2014
comment
Упс, я добавил не тот код, на данный момент он просто удаляет клон, а потом заново клонирует. Это хорошо, но с такими большими проектами, как наш, это занимает слишком много времени. Я удалил FileUtils.delete(destinationFolder, FileUtils.RECURSIVE) и добавил команду PullCommand cmd = Git.pull(); линия.   -  person verenion    schedule 12.03.2014
comment
Команда PullCommand = Git.pull(); это линия, которая терпит неудачу.   -  person verenion    schedule 12.03.2014
comment
В Git нет метода static pull, это метод экземпляра, поэтому вам нужен экземпляр Git, указывающий на репозиторий.   -  person tim_yates    schedule 12.03.2014
comment
Ах, это имело бы смысл, так что мне нужно создать новый объект Git, а затем выполнить метод pull для этого объекта?   -  person verenion    schedule 12.03.2014
comment
Должен сделать... Может быть new Git( new FileRepository( destinationFolder ) ).pull()? Ничего из этого не пробовал, так что это предположение ;-)   -  person tim_yates    schedule 12.03.2014
comment
Это в значительной степени именно тот код, который я использую, но сначала я получил сообщение об ошибке, говорящее, что он не может разрешить класс FileRepository. Я предполагаю, что мне нужно импортировать этот класс - import org.eclipse.jgit.lib.FileRepository; это не работает. Я также нашел это: import org.eclipse.jgit.storage.file.FileRepository; тот тоже выдает ошибку.   -  person verenion    schedule 12.03.2014
comment
Я предполагаю, что это org.eclipse.jgit.internal.storage.file.FileRepository. Это говорит о том, что он должен указывать на папку .git, я думаю... Какую ошибку вы получаете?   -  person tim_yates    schedule 12.03.2014
comment
Похоже, при импорте отсутствовал «внутренний» бит. Хорошо, теперь ошибок нет, вроде работает, но клонированные репозитории не обновляются с изменениями. С остальным, наверное, разберусь, спасибо за помощь!   -  person verenion    schedule 12.03.2014
comment
Да, это работает, но есть небольшая проблема - в основном из-за моих знаний о git. У меня есть клон пульта C:/repositories/www.mytestwebsite.dev. В этой папке есть мои исходные файлы из репозитория, а затем папка .git. Когда я извлекаю, какую из них я устанавливаю в качестве папки назначения для создания репозитория в коде? Код запускается, но, похоже, ничего не происходит, ни одно из моих изменений не выполняется.   -  person verenion    schedule 12.03.2014
comment
Кстати, если я делаю cd C:/repositories/www.mytestwebsite.dev, а затем git pull, он успешно извлекает все обновления. Я делаю что-то неправильно?   -  person verenion    schedule 12.03.2014
comment
Извините, я сейчас не в курсе этого... Может быть, удалить это и вместо этого задать новый вопрос по этой проблеме? Удачи!   -  person tim_yates    schedule 12.03.2014


Ответы (1)


спасибо @tim_yates за помощь в этом. Наконец понял это.

def cloneLocation = rootFolder + "/" + StringUtils.stripDotGit(repoName) + "";

// create the file repository object
FileRepository repo = new FileRepository("C:/myclonedrepos/.git");

// use the repository object to create a git object
Git git = new Git(repo); 

// create a pull command
PullCommand pullCmd = git.pull();  

// call the pull command
pullCmd.call();

git.repository.close();

logger.info("Pulled changes "+cloneLocation )

// report clone operation success back to pushing Git client
clientLogger.info("${repoName} pulled to ${destinationFolder}")
person verenion    schedule 12.03.2014
comment
Привет, @brighterdean, использование исходного/мастера для извлечения и сброса сохраняет ваши репозитории клонированными, а использование слияния сохраняет локальные изменения (но, может быть, вы этого хотите?) - person Tom Power; 27.10.2014
comment
@brighterdean У меня есть два частных сервера Gitblit A и B, мне нужно синхронизировать B с A, я обнаружил, что это возможно с помощью хука Groovy Posh, но я не знаю, где и как настроить этот хук? Любая помощь был бы признателен, спасибо - person HybrisHelp; 11.05.2015