Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git:忽略公共存储库的文件,但不忽略私有存储库的文件_Git_Version Control - Fatal编程技术网

Git:忽略公共存储库的文件,但不忽略私有存储库的文件

Git:忽略公共存储库的文件,但不忽略私有存储库的文件,git,version-control,Git,Version Control,我正在通过git在Heroku上部署一个Rails应用程序(目前),并且希望有一个公共版本供人们查看。有些文件是敏感文件,只能在“heroku”分支中提交和推送,而不能在“public”分支中提交和推送最好的方法是什么? (我确实知道Heroku的配置变量,这是一个很好的临时解决方案,但在需要切换主机时并不有趣。) 这两个分支不需要一直同步——我可以定期将“master”分支合并到“public”分支,并将其分别推送到github 我尝试过各种方法: 分离.gitignore文件和一个“我们的

我正在通过git在Heroku上部署一个Rails应用程序(目前),并且希望有一个公共版本供人们查看。有些文件是敏感文件,只能在“heroku”分支中提交和推送,而不能在“public”分支中提交和推送最好的方法是什么?

(我确实知道Heroku的配置变量,这是一个很好的临时解决方案,但在需要切换主机时并不有趣。)

这两个分支不需要一直同步——我可以定期将“master”分支合并到“public”分支,并将其分别推送到github

我尝试过各种方法:

  • 分离
    .gitignore
    文件和一个“我们的”合并策略-这起初不起作用,在处理了一段时间后,我觉得它变得太复杂了,只是为了完成一个看似简单的任务

  • 使用自定义的
    排除
    文件,并将以下内容添加到
    .git/config
    。。。这根本不起作用:

.git/config

[branch "public"]
  excludesfile = +info/exclude_from_public
让私有存储库和公共存储库共享同一代码,但忽略公共存储库中的敏感文件的最佳方法是什么?

您可以假设没有提交或推送任何代码,即这是一个新初始化的存储库


(这个问题以前曾以各种形式被问过,但没有一个答案是直截了当的,或者答案看起来很粗糙。我只是以一种非常简单的方式问这个问题,希望得到一个非常简单的回答。)

一种方法是将您的私人文件放在子模块中,并参考公共回购协议中的模块。(或者,您可以将公共文件放在子模块中,并从您的私有回购中引用该回购。)

创建两个分支。拥有私有文件的一家分支机构将不会推送到公共回购。合并后,使用
git checkout HEAD^--不应合并的文件
rm其他文件
git add-a
git commit--amend-C HEAD
,还原有问题的文件。我不确定有问题的文件有什么不同,但你明白了。为这个做一个小脚本,你就可以开始了。您甚至可以提交一个在根目录下提交的敏感文件列表,脚本也可以根据该列表执行操作。

您可以在本地repo中创建一个,在这里,您可以编写一个脚本来检查当前签出的分支,并在处理提交之前删除存在的有问题的文件。这避免了在错误分支的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
或者,脚本可以只检查文件并返回退出代码“1”,通知您提交无法继续,因为它包含敏感文件

需要注意的是,您需要将此脚本交给在“特权”heroku分支机构工作的任何人,并始终将其包含在您自己的本地回购协议中


理想情况下,您也可以在服务器端完成此检查;但不幸的是,GitHub只提供了post receive钩子的Web变体,因此,除非您提供,否则您自己的回购托管只能在本地执行此方法。

以下是一些其他StackOverflow问题和答案,内容与“如何在忽略某些文件的情况下进行合并”类似:

我能想到的最简单的方法是使用
别名
”合并,在执行合并提交之前删除私有文件。如果您愿意接受非快进合并,这将起作用。这是
别名

git config alias.merge-master-exclude-private '!git merge --no-commit --no-ff master && (git diff --name-only HEAD..master | grep -f private_files | while read f; do git reset HEAD -- "$f"; rm -f "$f"; done; git commit -m "Merge master, excluding private files.")'
然后编辑
private_文件
文件并添加私有的文件模式;例如
secret\u文件。*$
。您可以将别名中的
private\u文件
替换为
“$(git rev parse--show top level)”/private\u文件
,以便从顶级目录中读取
private\u文件

使用
git merge master exclude private
进行合并。这将在不提交的情况下执行非快进合并,在
private_files
文件中查找与模式匹配的文件,
reset
找到的任何私有文件的索引,删除工作目录中的私有文件,然后提交。这应该处理名称中有空格的文件


如果您不想进行提交,让您有机会编辑提交消息,请从别名中删除
-m“合并主机,不包括私人文件”。

我将支持子模块的答案,但尝试提供一些说明。首先,git不处理文件,而是处理提交。无法筛选分支中的文件或路径,因为分支实际上是指向提交的指针。当您排除或忽略文件时,您只是在阻止将文件添加到存储库中。所有“敏感文件”文件都不在存储库中,只在您的工作目录中

子模块只是对存储在存储库中的另一个存储库的引用,以及签出存储库正在跟踪的特定提交。您可以使用

git submodule update --recursive sensitive-files
为了简化操作,您可以在指向子模块路径的适当位置提交符号链接

ln -sf sensitive-files/shadow passwd
然后像添加任何其他文件一样添加符号链接

记住,子模块只是一个签出的git存储库,您可以轻松地限制对该实际存储库的访问,并将主存储库公开

更新:

抱歉,我错过了通知,如果您仍在处理此问题

您的私有存储库中可以有多个符号链接,引用在子目录中签出的私有存储库(子模块)。Rails实例使用的每个数据库或任何东西都可以是该私有子目录的符号链接

此外,您不需要远程指向私有存储库,只要