bri*_*ker 34 git version-control
我正在通过git在Heroku(现在)上部署一个Rails应用程序,并且还希望有一个公共版本供人们查看.有些文件是敏感的,只能在"heroku"分支中提交和推送,而不是"公共"分支.最好的方法是什么?
(我确实知道Heroku的Config变量,这是一个很好的临时解决方案,但是当我需要切换主机时却没那么有趣.)
这两个分支不需要一直同步 - 我可以定期将"master"分支合并到"public"分支并将其分别推送到github.
我尝试了各种各样的事情:
单独的.gitignore文件和"我们的"合并策略 - 这在一开始并不起作用,在搞乱了一段时间后我觉得它变得太复杂了,所以我可以实现一个看似简单的任务
使用自定义exclude文件,并将以下内容添加到.git/config...这根本不起作用:
的.git /配置
[branch "public"]
excludesfile = +info/exclude_from_public
Run Code Online (Sandbox Code Playgroud)
使私有和公共存储库共享相同代码但忽略公共存储库中的敏感文件的最佳方法是什么?
您可以假设没有提交或推送任何代码,即这是一个刚刚初始化的存储库.
(之前已经以各种形式提出了这个问题,但没有一个答案是直截了当的,或者答案看起来真的很笨拙.我只是在这里以非常简单的方式提出这个问题,希望得到一个非常简单的回答.)
Tim*_*ade 16
我将回答子模块的答案,但试着提供一些澄清.首先,git不处理文件,而是处理提交.无法过滤分支中的文件或路径,因为分支实际上是指向提交的指针.排除或忽略时,只是将文件保留在存储库中.没有任何"敏感文件"文件甚至在存储库中,只是在您的工作目录中.
子模块只是对存储在存储库中的另一个存储库的引用,以及检出存储库的特定提交正在跟踪.你可以说使用更新
git submodule update --recursive sensitive-files
Run Code Online (Sandbox Code Playgroud)
为了简化操作,您可以在指向子模块路径的适当位置提交符号链接.
ln -sf sensitive-files/shadow passwd
Run Code Online (Sandbox Code Playgroud)
然后像任何其他文件一样添加符号链接..
请记住,子模块只是一个已检出的git存储库,您可以轻松地限制对该实际存储库的访问并使主要存储库公开.
更新:
对不起我错过了通知,如果你还在为此工作.
您可以在私有存储库中有多个符号链接,引用在子目录中检出的私有存储库(子模块).每个数据库或Rails实例使用的任何内容都可以是该私有子目录中的符号链接.
此外,您不需要指向私有存储库的远程数据库,只需要.gitmodules文件中的一个条目,该文件由git子模块自动维护.您仍然需要保护私有存储库,以便只有您的Heroku实例才能访问它.为此我建议在服务器上安装gitosis,如果你可以或使用其他私人git托管解决方案.将与实例私钥匹配的公共ssh密钥添加到允许的用户列表中.(我不熟悉在Heroku中如何做到这一点.)
当您将更改推送到heroku时,它应该递归下载存储库中提到的所有子模块.
您可以在本地仓库中创建预提交挂钩,在这里您可以编写脚本来检查当前已检出的分支,并在处理提交之前删除有问题的文件(如果它们存在).这可以避免文件被记录在错误分支的Git历史记录中.
#!/bin/bash
current_branch="$(git branch | sed -e 's/^*//')"
if [ $current_branch != "heroku" ]; then
// Delete sensitive files before commit
rm -f dir1/dir2/exclude_from_public
rm -f dir1/dir2/exclude_from_public_also
fi
exit 0
Run Code Online (Sandbox Code Playgroud)
或者,脚本可以只检查文件并返回退出代码"1",通知您提交无法继续,因为它包含敏感文件.
需要注意的是,您需要将此脚本交给任何正在处理"特权"heroku分支的人,并且始终将其包含在您自己的本地仓库中.
理想情况下,您也可以在服务器端完成此检查; 但不幸的是GitHub只提供了post-receive hook的Web变体,所以除非你是自己的repo主机,否则这种方法只能在本地执行.
| 归档时间: |
|
| 查看次数: |
5370 次 |
| 最近记录: |