复制没有历史记录的git repo


200

我目前在github上有一个私有存储库,希望将其公开。但是,一些初始提交包含我不想公开的信息(硬编码凭据等)。

在不包括部分或全部提交历史记录的情况下,公开最新提交(最不需要公开存储库中的我确实不需要或最先提交)的最简单方法是什么?


您为什么不只创建一个新的存储库?
斯蒂芬

2
@Stephan我很好地创建了一个新的存储库,但是如何从旧存储库中获取最新状态并将其提交到新存储库中呢?
拉菲,2015年

19
您可以删除.git文件夹,然后在源文件夹中再次执行git init
Stephan

2
删除文件夹git的会让你的两个repositores不相容,你将无法从一个合并到其他
阿诺德·罗亚

你不能变基吗?您实际上只是压缩所有旧的提交,然后(强制)推送。
xaxxon

Answers:


321

您可以在克隆时限制历史记录的深度:

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

如果您想要有限的历史记录,但仍要使用某些记录,请使用此选项。


40
给这个人一个饼干(以正确答案的形式标记):)
FateNuller

7
这不能解决问题所隐含的预期用途,即能够推送到远程公共存储库。尝试推入浅表克隆会导致shallow update not allowed
布拉德·诺克斯

279

使用以下命令:

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

哪里:

  • depth是您要包括的提交量。即,如果您只想使用最新的提交git clone --depth 1
  • branch是要从其克隆的远程分支的名称。即,如果您希望master分支使用最后3次提交git clone --depth 3 -b master
  • repo_url 是您存储库的URL

7
这实际上是与Gautier相同的答案,但更完整,并带有示例。
出发

3
的确是。有时,例子就是所需要的。对我来说,写出来是什么澄清了问题
阿甘Rafaeli

3
对主要答案+1,但也对这个答案+1,以解释有关选择要应用于深度的分支的信息-我知道这是clone命令的一部分-但在我简单的脑海中,它就很好地将它们联系在一起了...和我一样简单
:)

7
这如何回答这个问题?这一切都是在本地创建浅表克隆,但是那又如何呢?您如何将历史记录有限的本地副本复制到新的仓库中?
BradDaBug

4
@BradDaBug提出了一个有效的观点。我按照上面的说明将深度限制为1,然后更改了远程原点,然后尝试推送到我的新仓库。但是,我收到一条错误消息,指出shallow update not allowed。我发现此堆栈溢出答案在这种情况下很有用。
Craig Myles

18

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

所以,你可以从你的最新创建一个新的回购承诺:如何克隆的种子/无整个历史脚踏启动项目?

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

6
#!/bin/bash
set -e

# Settings
user=xxx
pass=xxx
dir=xxx
repo_src=xxx
repo_trg=xxx
src_branch=xxx

repo_base_url=https://$user:$pass@bitbucket.org/$user
repo_src_url=$repo_base_url/$repo_src.git
repo_trg_url=$repo_base_url/$repo_trg.git

echo "Clone Source..."
git clone --depth 1 -b $src_branch $repo_src_url $dir

echo "CD"
cd ./$dir

echo "Remove GIT"
rm -rf .git

echo "Init GIT"
git init
git add .
git commit -m "Initial Commit"
git remote add origin $repo_trg_url

echo "Push..."
git push -u origin master

2
--depth 1是在这种情况下不必要的,因为历史与也被删除rm -rf .git
rayphi

3
我想我会这样:git clone --depth 1 -b $src_branch $repo_src_url $dir && cd ./$dir && git commit --amend --author "Some One <some@one.com>" -m "Initial Commit" && git remote set-url origin $repo_trg_url && git push -u origin master
rayphi '17

11
@rayphi是的,这--depth 1是不必要的,但它也是无害的,并且节省了一点网络带宽(获取要删除的历史记录毫无意义)
Silas S. Brown

1
如果您要保持存储库兼容,建议不要这样做。
阿诺德·罗阿

删除.git也会删除所有git钩子。
犹大牧师

0

这难道不是压榨rebase的作用吗?压扁除最后一次提交以外的所有内容,然后(强制)推送它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.