复制一个没有历史记录的git回购

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

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

167475 次浏览

你可以限制历史的深度,而克隆:

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

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

使用如下命令:

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
#!/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

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

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

git clone <git_url>

然后删除.git,然后运行

git init

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

按照以上步骤进行:

git add .
git commit -m "Initial commit"

推到你的回购。

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

这难道不正是破坏重组的原因吗?只需要压缩所有内容,除了最后一次提交,然后(强制)推送它。

您可以将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

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

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

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

这里的许多答案使用git clone --depth 1来保存最后一次提交(包括提交消息)。

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