如何从git存储库中过滤发布的特定文件?

时间:2014-08-20 08:17:25

标签: git release-management

请问,可以在开发git存储库中创建一个独立的分支,它只包含一个没有回归测试的特定文件,例如?怎么样?

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

我看了Git: Transfer Specific Files and Histories From One Repository to Another,但我不想用filter-branch创建一个全新的回购。我更愿意只创建一个包含整个历史记录但已剥离到特定文件的发布分支。请说git log --filegit filter-branch的组合。

2 个答案:

答案 0 :(得分:1)

发布管理应与开发分开。

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

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

答案 1 :(得分:1)

我找到了原始问题的技术解决方案,但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

是否有更优雅的技术解决方案?