Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.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_Publishing_Privacy_Computer Forensics_Git Reflog - Fatal编程技术网

是否有一种规范的方法可以追溯性地将git回购拆分为公共和私人变体?

是否有一种规范的方法可以追溯性地将git回购拆分为公共和私人变体?,git,publishing,privacy,computer-forensics,git-reflog,Git,Publishing,Privacy,Computer Forensics,Git Reflog,我有一个git存储库,其中包含一些敏感数据,这些敏感数据可能是硬编码的,也可能是正式硬编码的,现在位于git历史中的某些点上 为了使该项目公开,以便具有类似兴趣的编程人员能够从中受益并贡献更改,我想用叉子清理这些有问题的文件 我考虑的程序如下: 浅层/共享将repo本地克隆到新的本地位置,此文件夹将成为公共变体。后续步骤在新回购协议中 将主机分支到分支公共主机 删除所有其他分支参照 清理public master 挤压public master git reflog expire--expire

我有一个git存储库,其中包含一些敏感数据,这些敏感数据可能是硬编码的,也可能是正式硬编码的,现在位于git历史中的某些点上

为了使该项目公开,以便具有类似兴趣的编程人员能够从中受益并贡献更改,我想用叉子清理这些有问题的文件

我考虑的程序如下:

  • 浅层/共享将repo本地克隆到新的本地位置,此文件夹将成为公共变体。后续步骤在新回购协议中
  • 将主机分支到分支
    公共主机
  • 删除所有其他分支参照
  • 清理
    public master
  • 挤压
    public master
  • git reflog expire--expire unreachable=now--all&&git gc--prune=all--agressive
    remove all unreachable ref,它现在是任何不在公共分支中的对象
  • git push
    将公共主机添加回私有存储库的上游
  • 将origin remote设置为public repo url,分支到
    master
    。推到原点
  • 这是否足以清理我的回购协议,或者在此之后是否有可能恢复敏感数据。有没有更明智、更普遍的方法来解决这个问题?这些步骤有什么不相干的吗

    例如,我可以在一个存储库中完成这一切,或者git包的性质是否意味着我仍然可以推送包含敏感信息的
    obj

    唯一的问题是,我希望能够从私人回购中撤出,这样他们就有了非共享的历史

    这似乎是不可避免的,因为您已经更改了分支历史并将其压扁

    不是简单地从新的公开回购中撤出,而是简单地考虑新的回购计划中的一个变更,并决定我要向旧的私人回购的地方克隆添加哪一个:< /P>
    # update local content of new repo
    cd /path/to/public/repo 
    git pull
    
    # check what needs to be added
    cd /path/to/clone/of/old/repo
    git --work-tree=/path/to/public/repo add -p .
    
    你会看到新旧之间的差异,这是由于公共回购协议可能发生的新变化

    唯一的问题是,我希望能够从私人回购中撤出,这样他们就有了非共享的历史

    这似乎是不可避免的,因为您已经更改了分支历史并将其压扁

    不是简单地从新的公开回购中撤出,而是简单地考虑新的回购计划中的一个变更,并决定我要向旧的私人回购的地方克隆添加哪一个:< /P>
    # update local content of new repo
    cd /path/to/public/repo 
    git pull
    
    # check what needs to be added
    cd /path/to/clone/of/old/repo
    git --work-tree=/path/to/public/repo add -p .
    

    您将看到新旧之间的差异,这来自于公共回购协议上可能出现的新变化。

    结合@VonC和@b-fg答案,我认为最明智的解决方案如下。 请注意,很容易用可能包含敏感日期的OBJ污染新的公共存储库,而是构建一个新的公共存储库

  • 将专用存储库分支到
    public
  • 清理
    public
  • 首次公开新回购协议
  • git--work tree=/path/to/private add-p。
    导致git使用公共索引运行,但使用私有的净化工作树。public repo现在已将经过清理的分支的所有工作树分段,因此
    git commit
  • 本地存储库在索引中有来自净化分支的工作树,但没有工作树,换句话说,在git看来,当前工作树中的所有内容都已从索引中删除。“使用
    git reset--hard
  • 切换回专用存储库并将公共存储库添加为远程存储库<代码>git远程添加公共file://path/to/public/repo
  • 历史
    private/public
    public/master
    现在是不相交的。所以我们需要把它们嫁接在一起。使用
    git branch-u public master
    设置
    private/public
    的上游
    git pull-允许不相关的历史
  • 将公共分支设置为只能读取而不能写入更改,以防止意外污染公共repo
    git remote Set url public--push“此分支是只读的”

  • 现在只需在公共存储库中创建新功能,并根据需要将它们拉回到私有存储库中。

    结合@VonC和@b-fg答案,我认为最明智的解决方案如下。 请注意,很容易用可能包含敏感日期的OBJ污染新的公共存储库,而是构建一个新的公共存储库

  • 将专用存储库分支到
    public
  • 清理
    public
  • 首次公开新回购协议
  • git--work tree=/path/to/private add-p。
    导致git使用公共索引运行,但使用私有的净化工作树。public repo现在已将经过清理的分支的所有工作树分段,因此
    git commit
  • 本地存储库在索引中有来自净化分支的工作树,但没有工作树,换句话说,在git看来,当前工作树中的所有内容都已从索引中删除。“使用
    git reset--hard
  • 切换回专用存储库并将公共存储库添加为远程存储库<代码>git远程添加公共file://path/to/public/repo
  • 历史
    private/public
    public/master
    现在是不相交的。所以我们需要把它们嫁接在一起。使用
    git branch-u public master
    设置
    private/public
    的上游
    git pull-允许不相关的历史
  • 将公共分支设置为只能读取而不能写入更改,以防止意外污染公共repo
    git remote Set url public--push“此分支