我在GitHub上有一个私人存储库,我想让它公开。但是,一些初始提交包含我不想公开的信息(硬编码的凭证等)。

在不包含部分或全部提交历史的情况下,使最近的提交公开(我真的不需要或不希望在公共存储库中保存以前的提交)的最简单方法是什么?


当前回答

首先,我应该说,如果只有几个提交包含敏感信息,你最好使用git rebase -i来删除它们。但当这些文件经常被触摸时,情况就会变得复杂。同样,使用git-rebase删除初始提交是非常困难的,所以如果初始提交包含想要删除的内容,那么事情就会变得更加困难。

但无论如何,上面所有将整个回购折叠成一次提交的答案似乎都过于复杂,而且还会非常缓慢,涉及大量中间目录,并且可能会破坏存储在.git中的所有其他配置。

一个更快的方法是创建一个完全匹配现有提交的孤立提交,例如:

$ TREE=`git cat-file -p master |sed '1,/^$/s/^tree //p;d;'`
$ COMMIT=`echo Truncated tree | git commit-tree $TREE`
$ git branch truncated-master $COMMIT

根据需要替换master和截断的-master,并根据需要更改提交消息。如果你觉得自己很勇敢,那就继续:

$ git branch backup-master-just-in-case-i-regret-it-later master
$ git push -f origin truncated-master:master

但是,如果我是您的话,我真的会避免执行最后一步,因为它会给当前使用该回购的所有其他人带来问题。相反,只需切换到使用这个新分支(可能有一个更好的名称),而不要宣传旧的分支。

其他回答

删除.git文件夹可能是最简单的路径,因为您不想要/不需要历史记录(如Stephan所说)。

所以你可以从最近的提交中创建一个新的repo: (如何克隆种子/启动项目没有整个历史?)

git clone <git_url>

然后删除。git,然后运行

git init

或者如果你想重复使用你当前的回购: 使当前提交成为Git存储库中唯一的(初始)提交?

按照以上步骤进行:

git add .
git commit -m "Initial commit"

推到你的回购。

git remote add origin <github-uri>
git push -u --force origin master

你可以在克隆时限制历史的深度:

--depth <depth>
Create a shallow clone with a history truncated to the specified 
number of revisions.

如果你想要有限的历史记录,可以使用这个。

You could set the GitHub repository to be a template (by going to settings and selecting the option just under the repository name). A button saying "Use this template" will then appear on the Code page. This copies over all the files but removes all history and if you keep the original repo as private, this doesn't show any details under the repo name (note that it will show on your site as you own both but not to anyone else). It's only if the repo is public that a link to the original repo appears under the repo name.

这里的很多答案都使用了git克隆——depth 1,它保留了最后一次提交(包括提交消息)。

如果你想改变最后的提交消息(来自克隆的分支),你可以在克隆之后使用命令:git commit——modify -m "UPDATED message HERE"。

使用如下命令:

git clone --depth <depth> -b <branch> <repo_url>

地点:

深度是要包含的提交数量。例如,如果你只想要最新的提交,请使用git clone—depth 1 Branch是要从中进行克隆的远程分支的名称。例如,如果你想从master分支提交最后3次,使用git clone——depth 3 -b master Repo_url是存储库的url