如何自定义/覆盖Travis CI中的“git clone”步骤?

时间:2015-09-15 08:05:00

标签: travis-ci

在安装步骤中,Travis CI克隆了repo,其外观类似于:

git clone --depth=50 --branch=master https://github.com/user/repo.git user/repo

如何自定义/覆盖?

背景:我正在使用基于标签的部署。 Travis检查标记构建(--branch=<tagname>)的方式,git存储库处于分离状态而无法访问分支。但是,对于部署,我需要知道我是哪个分支。我的解决方案是执行“普通”克隆,然后切换到标记的提交。

8 个答案:

答案 0 :(得分:13)

您可以在安装步骤中再次克隆存储库 。这样你就可以两次克隆存储库,但它似乎有效。

# .travis.yml
install:
  - git clone https://github.com/$TRAVIS_REPO_SLUG.git $TRAVIS_REPO_SLUG
  - cd $TRAVIS_REPO_SLUG
  - git checkout -qf $TRAVIS_COMMIT

答案 1 :(得分:3)

我发现为了访问您的整个仓库,您需要以下内容:

install:
  - git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
  - git fetch --unshallow --tags

这样您就可以访问远程分支和标签(例如可以结帐)。

如果你在标签上但又不想处于分离的HEAD状态,你可以创建一个指向标签的新分支(根据this discussion):

install:
  - git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
  - git fetch --unshallow --tags
  - git symbolic-ref --short HEAD || git checkout -b ${TRAVIS_BRANCH}-test $TRAVIS_BRANCH

注意:如果您处于分离的HEAD状态,git symbolic-ref --short HEAD将失败。

答案 2 :(得分:1)

问题不在于您是否处于分离的分支中。这是git不允许您获取标记:git fetch --tags只会在您提供的--branch命令中获取由git clone指定的分支。

我在更详细地解释了这一点this answer

要解决您的问题(签出特定标签),您可以在克隆回购后调用这样的脚本:

    # Keep track of where Travis put us.
    # We are on a detached head, and we need to be able to go back to it.
    build_head=$(git rev-parse HEAD)

    # fetch the tags
    git config --replace-all remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
    git fetch --tags

    # checkout the tagged commit
    git checkout -qf <your tag>

    # now do your stuff

    # go back to where we were at the beginning
    git checkout ${build_head}

答案 3 :(得分:1)

在构建期间运行此命令以访问原始标记/分支

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*" 1>/dev/null
git fetch origin -q

之后,您可以运行此命令来查找包含您的提交的分支

BRANCHES=`git branch -a --contains "$TRAVIS_TAG"`

我在很久以前创建了一个脚本来获取'环境'分支,其中标签是为了持续部署而创建的。

它可能会激励你:https://gist.github.com/rolebi/a0eb1f783b7f3a5f21a631c8da1582dc

使用它:

TARGET_ENV="`test $TRAVIS_TAG && bash scripts/get_branch_for_git_reference.sh $TRAVIS_TAG`"

答案 4 :(得分:1)

对于每个the Travis docs,您可以将以下内容添加到.travis.yml中,以删除--depth标志:

git:
  depth: false

--depth暗示--single-branch,删除此标志意味着所有分支将被检出,这不是默认行为。

答案 5 :(得分:0)

您可以将现有的浅层克隆转换为完整克隆。为此,请在安装步骤中执行 git fetch --unshallow (自git版本1.8.3起可用)。

# .travis.yml
install:
  - git fetch --unshallow --tags

- tags 标记强制获取所有标记,即使它们不属于签出的分支。如果您的构建还依赖于来自其他分支的标记,则需要这样做。

答案 6 :(得分:0)

或者你可以只查询遥控器。将以下内容添加到.travis.yml

env:
    global:
        # get all the branches referencing this commit
        - REAL_BRANCH=$(git ls-remote origin | sed -n "\|$TRAVIS_COMMIT\s\+refs/heads/|{s///p}")

        # or check if we are on a particular branch:
        - IS_RELEASE=$(git ls-remote origin | grep "$TRAVIS_COMMIT\s\+refs/heads/release$"

(我很惊讶git guru还没有拿出这个)

答案 7 :(得分:0)

禁用this,然后在安装步骤中再次克隆存储库。这样,该存储库将仅克隆一次。在这个“ 正常”克隆中,您将可以做任何您想做的事情。

git:
  clone: false
install:
  - git clone https://github.com/$TRAVIS_REPO_SLUG.git $TRAVIS_REPO_SLUG
  - cd $TRAVIS_REPO_SLUG