【问题标题】:How to filter particular files for the release from a git repository?如何从 git 存储库中过滤特定文件以进行发布?
【发布时间】:2014-08-20 08:17:25
【问题描述】:

拜托,可以在开发 git 存储库中创建一个独立的分支,该分支将仅包含特定文件,用于没有回归测试的版本,例如?怎么样?

例如,我想创建这个只包含 perl 命令的分支,并将其推送到/usr/local/bin 中的 git 存储库。与主分支合并后,部署将具有(更改和发布)历史轨迹,但没有测试开发历史等。

我阅读了Git: Transfer Specific Files and Histories From One Repository to Another,但我不想用filter-branch 创建一个全新的存储库。我宁愿只创建一个包含整个历史记录但被剥离到特定文件的发布分支。假设是git log --filegit filter-branch 的组合。

【问题讨论】:

    标签: git release-management


    【解决方案1】:

    发布管理应该与开发分开。

    • 在您的版本控制工具(此处为 git)中管理开发,并使用其他文件(如您的测试文件)
    • release 是一个过程,它需要一个包(在您的情况下,是除测试文件之外的所有文件)并部署它们(这里简单复制到 /usr/local/bin)

    您不需要调整存储库的历史记录来表示“包”(要在目标环境中部署的文件集)。
    您应该将您的 repo 推送到服务器(目标环境)上的 bare repo,并让 post-receive hook 负责部署(将正确文件的副本复制到 /usr/local/bin

    【讨论】:

    • 谢谢。而编译+构建就是创建包的过程。是否应该在某些 git repo 中对包进行版本控制,或者只是存档? /usr/local/bin 中是否有一些反对 git repo 的论点(如etckeeper)。因此可以快速恢复部署。还是更好地强制安装以前的包(或删除新的并安装以前的包)?您能否添加更多关于 git 最佳构建/发布/部署实践的链接?见A successful Git branching model
    • "是否应该在某个 git repo 中也对包进行版本控制,或者只是存档?"未存档在 source 控制系统中,而是存档在工件引用中(请参阅stackoverflow.com/a/25236654/6309。更多链接位于stackoverflow.com/a/23777122/6309)。成功的 Git 分支模型是关于开发工作流程,而不是发布管理。
    【解决方案2】:

    我找到了一个技术解决我原来问题的方法,但是关于发布管理的 VonC 答案更正确。

    set -e
    git filter-branch --prune-empty --index-filter '
      git ls-tree -z -r --name-only --full-tree $GIT_COMMIT \
      | grep -v "^\(some_file_regexp\|another_file_regexp\)$" \
      | xargs -0 -r git rm -q --cached -r --ignore-unmatch'
    git checkout -b release
    git checkout master
    git reset --hard refs/original/refs/heads/master
    rm -r .git/refs/original
    

    有没有更优雅的技术方案?

    【讨论】:

    • 如果您坚持调整历史记录,那么您的解决方案似乎不错。 +1。我在下面的 cmets 中添加了一些关于开发和发布管理分离的链接。
    猜你喜欢
    • 2014-01-14
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 2015-07-18
    • 2010-10-13
    相关资源
    最近更新 更多