Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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镜像到GitHub并过滤私有文件_Git_Github_Version Control_Git Filter Branch_Git Amend - Fatal编程技术网

git镜像到GitHub并过滤私有文件

git镜像到GitHub并过滤私有文件,git,github,version-control,git-filter-branch,git-amend,Git,Github,Version Control,Git Filter Branch,Git Amend,目前正在进行一个项目。我们希望在过滤掉一些特定的私人文件夹的同时,用完整的信息(作者等)公开我们的日常提交 假设我在branch master中提交A/file1和B/file2,我希望在GitHub上镜像它,并过滤B文件夹(此提交将只包含A/file1) 我考虑的一种方法是使用远程更新挂钩: 列出newref添加的所有新提交(比如lastfoundcommit..newref) 逐个修改这些提交(从lastfoundcommit到newref),以删除不需要的文件 在此过程中,它可能会创建一

目前正在进行一个项目。我们希望在过滤掉一些特定的私人文件夹的同时,用完整的信息(作者等)公开我们的日常提交

假设我在branch master中提交A/file1和B/file2,我希望在GitHub上镜像它,并过滤B文件夹(此提交将只包含A/file1)

我考虑的一种方法是使用远程更新挂钩:

  • 列出newref添加的所有新提交(比如lastfoundcommit..newref)
  • 逐个修改这些提交(从lastfoundcommit到newref),以删除不需要的文件
  • 在此过程中,它可能会创建一个本地主筛选分支(如果它有助于在本地进行筛选)
  • 将此分支推送到公共存储库
  • 以某种方式在私有和公共提交之间保持提交ID的映射,以便在下一次推送时轻松计算“lastfoundcommit”
理想情况下,它可以是双向的(也就是说,如果我们还可以导入回github分支并拉取请求,并让它们在我们的私有存储库上“重新设置基址”,无论是自动地还是通过一个简单的过程——可能不会像重新设置基址那样困难),这将是一件好事

这有点类似于git子树所能做的,只是它不是提取子目录,而是过滤各种文件

这看起来可行吗?还是其他建议?(可能基于git filter branch?或任何其他可能帮助我的现有工具/脚本?)


注意:子模块不是一个可行的选择,因为它们可能是稀疏的,并且它会阻碍太多。此外,“私有”文件列表可能会随着时间的推移而扩展/更改。

您的计划很好,只是它应该使用
git过滤器分支来重写提交。
filter branch
命令是为类似的目的而设计的,它为您提供了以任何方式重写提交的最大能力

让您提供给
过滤器分支的脚本记录从旧到新的提交映射是非常容易的


也就是说,尽管你说子模块不是一个可行的选择,但在我看来,在顶层使用一个“私有”文件夹(实际上是一个单独托管的git存储库)比你建议的重写历史要好。它不容易出错,更容易实现,更容易理解。

我也遇到过类似的情况:

不要使用git过滤器分支 改用。它的速度更快,使用更方便

您需要定期删除回购协议中的所有提交,以避免提及您的私人文件夹/文件

划分存储库 拥有完整的回购协议和OSS one。让你的脚本将文件从一个传输到另一个,并在OSS one上进行特殊测试,这样你就无法在那里找到你不应该找到的东西

两个存储库都应该在您的网络中,最好在同一台机器上(安全性)。仅允许、检查和清理OSS repo的分支离开机器(推送到GitHub或任何地方)

使用子模块 对子模块/子树进行POC,看看它们是否比脚本工作得更好。你会再浪费2个小时,而且你肯定知道。我认为他们可能是可行的选择,因为你们有私人文件夹

使用项目忽略和.git/info/exclude 您可以使用
.git/info/exclude
来排除OSS repo中的私有文件和文件夹,这样即使是有意避开git注意的私有文件和文件夹的信息也不会泄露出去

在通常的repo上,您可以将这些文件添加到.gitignore的一个分支上,该分支用作初始过滤器,稍后用于向OSS repo提供信息