2016-01-21 59 views
1

假设我有一个脚本驱动的构建过程,在两个易于检出的工作目录(一个用于连续构建,一个用于夜间构建)上工作。Git:获取自动构建的远程更改

在Subversion中,我将运行svn update进行连续编译,然后只有在该更新获得任何更改时才构建。对于每晚构建,我会运行svn update -r{01:00:00 UTC}并在任何情况下构建。

这与svn:externals,甚至与本地修改,只要他们不与来自存储库的更新冲突,正常工作。

现在我想向脚本添加Git支持,从master repo的master分支获取更新,并且正在寻找Git命令来“做正确的事情”。

看过git pull --rebase origin/master

由于我使用Git极其有限的实践经验(一两个小时,算下来,一年半前),我不知道是否会漂浮了我的船,或者等到我变得自满只我船然后,由于在Git的工作流程,我不知道的东西...

希望得到从原点回购所有更改而不进行事务当前状态倾销本地修改,有一次,一个用于状态作为给定的时间戳,什么是正确的Git命令?

+0

可能重复[比较本地git分支与远程分支?](http://stackoverflow.com/questions/1800783/compare -local-git-branch-with-remote-branch) – Ferrybig

+0

@Ferrybig:diff问题如何在自动化环境中帮助我? *任何情况下*都不会更新我的工作目录。 – DevSolar

+0

使用该命令,您可以获得纯文本的差异,这是您可能对您提出问题的解释之一,尤其是当您没有清楚说明您想要的结果时。 diff命令以平面状态返回结果而不更改本地副本。你可以编辑你的问题,用图表显示运行一个命令之后你期望的结果吗? – Ferrybig

回答

1

我知道你说你不想转储任何地方的变化,但使用CI一工作本地存储库(即,一个在那里你也正在做开发工作)是一个“坏主意”。

将远程存储库的多个克隆存放在不同的目录中并将它们用于不同目的没有任何问题。我认为你过于复杂化你的过程。我会在你的情况下,至少使用三个克隆:

  • 一个地方,你做你的发展从中你做你的CI
  • 一个版本,它总是保持最新与远程。
  • 一个用于构建特定的历史快照

在该脚本中,你基本上要做到以下几点

  • 检查是否有任何改变上游资源库,你不有你本地副本
  • 如果是这样,请更新您的本地副本以包含更改。

我假设你的本地副本是有效的只读 - 即你不会在该副本中创建任何新的提交。我也是(为了简单起见)假设只有一个分支叫master

这些命令处理的第一步

$ git fetch origin 
$ CHANGED=$(git branch -v | grep -q '\[behind')$? 

在此之后,CHANGED将是零,如果你是远程的背后(即有你需要拉下变化),否则是会1

要搞垮缺少变化,简单地做

$ git pull 

,然后触发您的CI版本。

在所有配置项脚本bash可能是这样的:

cd $REPOSITORY_DIR 
git fetch origin 
CHANGED=$(git branch -v | grep -q '\[behind')$? 

if [ $CHANGED -eq 0 ] 
then 
    git pull 
    start_CI_build() 
fi 

为每晚构建,它只是

cd $REPOSITORY_DIR 
git fetch 
git pull 
start_nightly_build() 

几乎肯定在git管道命令,这将给你直接的CHANGED状态......但对于新工具的人来说,这是一个直接的方法。

对于从特定时间点构建...以及您在这里遇到颠覆和混帐之间的哲学区别。在git我们更多地使用标签,而不是日期。但如果你真的需要这样做,这是在接受的答案this question

+0

谢谢你的回答,我会尽快测试。我知道CI展位的本地变化并不是一个好主意。这是一个更大的CMake框架的一部分,同样的脚本也做了“实验性”构建,这是我发现CTest的默认行为'reset --hard' ....现在我正在寻找一个合适的设置对于'CTEST_UPDATE_CUSTOM' ...好吧,你帮了我,让我们看看这有多远。 ;-) – DevSolar

+0

查看'git stash'来保存和恢复本地更改,并检查你想从临时本地分支上创建的提交(无头为此工作),但我试图保持简单,因为你是新的去玩 – kdopen