我有一个使用Git版本的项目,我想开源,但它有一些私人信息,特定于最初使用它的环境.我将更改有问题的信息,以从未包含在存储库中的配置文件加载.我知道我应该首先做到这一点,但由于私人信息仍然存在于以前的提交中,我怎样才能将其从历史中删除?我是否只需要根据最新提交启动新存储库并丢失所有历史记录,或者是否有办法在删除任何私人信息记录时抢救当前存储库?
编辑:为了澄清,我不想完全删除包含此私人信息的文件,因为它们仍然使用.相反,我想删除/删除/更改其中某些字符串的出现.
我有一个包含两个分支的项目:master和gh-pages.它们本质上是两个不同的项目,其中gh-pages项目依赖于主项目(反之亦然).可以把它想象成"master包含源代码,gh-pages包含从这些源文件构建的二进制文件".我定期地接受在master中累积的更改,并使用提交消息"与主提交xxxxxxxx一致"对gh-pages分支进行新提交.

经过一段时间的这样做,我意识到,如果gh-pages提交"与主提交xxxxxxxx一致"实际上将xxxxxxxx作为其git存储库中的父项,那将会很好.像这样(糟糕的MSPaint艺术):

有没有办法让存储库看起来像上面的第二个图像?我知道如何使新的提交遵循这种模式:我可以做"git merge -s our master"(设置其他空提交的父项),然后是"git commit --amend adv550.z8"(其中adv550.z8)是实际正在改变的二进制文件).但git是否可以让您轻松回过头来为旧提交添加新父母?
一旦我让我的本地回购看起来正确,我完全愿意"git push -f"并且吹走我的Github存储库的当前历史.现在的问题是,可以让我的本地回购找吧?
编辑年后再添加:我最终放弃了尝试使git历史gh-pages看起来像这样的尝试; 我认为零收益太过分了.我的新做法是积极地压缩提交gh-pages,因为在我的情况下保存这些提交消息并不重要.(这只是"与主提交相符......"的长线,其中没有一个在历史上很有意思.)但是,如果我需要再次这样做,我会听到所说的答案
git merge $intended_parent_1 $intended_parent_2
git checkout $original_commit -- .
git commit --amend -a -C $original_commit
Run Code Online (Sandbox Code Playgroud) 我想要摆脱一大块斑点!我以为我使用这个解决方案删除了文件:http:
//dound.com/2009/04/git-forever-remove-files-or-folders-from-history/
(我用过-- --all而不是HEAD删除文件从所有分支机构)
rm -rf .git/refs/original/ && git reflog expire --all &&
git gc --aggressive --prune
Run Code Online (Sandbox Code Playgroud)
我通过这个看了包文件夹为什么我的git存储库这么大?
$ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k3n
... last 4 lines:
bc7ae9801052180b283cd81880753549f0f92587 blob 19464809 749446 305054873
acd5f09a35846bec25ebc324738139e5caabc50f blob 294278199 71381636 39607483
986d152935434b56cf182d8a32e24cb57af75ac3 blob 480385718 108184804 110989119
ba9d1d27ee64154146b37dfaf42ededecea847e1 blob 761172819 27430741 277589990
Run Code Online (Sandbox Code Playgroud)
该脚本git-find-blob取自哪个提交有这个blob?
$ ./git-find-blob ba9d1d27ee64154146b37dfaf42ededecea847e1
Run Code Online (Sandbox Code Playgroud)
但它没有找到任何东西.
任何想法如何摆脱我的存储库?
我使用以下程序用BFG Repo Cleaner清理了我的回购:
$ git clone --mirror git://example.com/some-big-repo.git
$ java -jar bfg.jar --strip-biggest-blobs 500 some-big-repo.git
$ cd some-big-repo.git
$ git reflog expire --expire=now --all
$ git gc --prune=now --aggressive
$ git push
Run Code Online (Sandbox Code Playgroud)
我可以看到我的本地仓库收缩了1GB.大.我现在遇到的问题是我现在无法找到任何信息,现在我也希望缩小GitHub-repo的大小.怎么做到这一点?
git push没有工作,我也试过git push origin --force --all,这给了我这个错误信息:error: --all and --mirror are incompatible
我已经在我的git central repo服务器上添加了receive.denyNonFastforwards和receive.denyDeletes.现在我想阻止本地历史修改,如果提交已经被推送到中央仓库(就像默认情况下mercurial一样),我想我可以使用钩子但我找不到任何例子.
这是一个奇怪的配置吗?
这听起来像是一个基本的保护措施,任何使用git的人都应该激活,我对缺少示例钩子感到非常惊讶.
我经常重新定义交互式以在历史记录中进行微小的更改(例如删除空白行或编辑一行).在大多数情况下,这些变化是基于一些同行评审.
起初我做这样的改变:
git rebase --interactive 83bbeb27fcb1b5e164318fa17c55b7a38e5d3c9d~
# replace "pick" by "edit" on the first line
# modify code
git commit --all --amend --no-edit
git rebase --continue
Run Code Online (Sandbox Code Playgroud)
如果以下提交之一中存在合并冲突,我将解决它们并执行此操作:
git rebase --continue
# the commit message is shown, but does not have to be changed, so I just save and exit the editor
git rebase --continue
# the commit message is shown, but does not have to be changed, so I just save and exit the editor
git rebase --continue
# the …Run Code Online (Sandbox Code Playgroud) 关于StackOverflow上的"flattening merge"的问题很少,答案通常是"git rebase".这些答案虽然错过了一个关键点 - 提交顺序.
假设有一个分支A,其中包含6月1日和8月1日的提交,而分支B具有7月1日的提交(更新以恢复下面描述的用例:分支是完全独立的,没有共同的祖先,例如来自2个不同的存储库).将B合并到A中时,会有以下历史记录(每个git日志):
Merged branch 'B'
Aug 1
Jul 1
Jun 1
Run Code Online (Sandbox Code Playgroud)
现在,我正在寻找的是获得相同结果的方法,但是没有合并提交(因此具有基础线性历史的顺序,是的,这意味着重新提交提交).git rebase在这里没有用,就像它一样,你会得到以下历史:
Jul 1
Aug 1
Jun 1
Run Code Online (Sandbox Code Playgroud)
要么
Aug 1
Jun 1
Jul 1
Run Code Online (Sandbox Code Playgroud)
换句话说,git rebase总是将一个分支堆叠在另一个分支之上,而我正在寻找解决方案,它将按作者的提交日期排序提交.
显然,对于简单的情况,可以通过使用git rebase -i手动后处理git rebase来实现所需的安排,但这对大型历史来说并不实用,所以我一直在寻找自动命令/脚本.
用例?如果A和B代表同一个项目的不同部分碰巧在不同的回购中,并且时间已经通过将它们合并在一起来纠正,那么很自然地希望线性历史以实际的开发顺序展开.
如何使用BFG仅删除一个目录?
帮助说:
delete folders with the specified names (eg '.svn', '*-tmp' - matches on folder name, not path within repo)
这似乎意味着--delete-folders "config"将匹配存储库中任何位置的所有名为config的文件夹.
注:类似的问题,因为这一个,但也有一些重要的变化.
在给定提交ID的情况下,我有以下函数来重写提交的日期:
rewrite-commit-date () {
local commit="$1"
local newdate="$2"
newdate="$(date -R --date "$newdate")"
echo ">>>> Rewriting commit $commit date: $newdate"
git filter-branch --env-filter \
"if test \$GIT_COMMIT = '$commit'
then
export GIT_AUTHOR_DATE
export GIT_COMMITTER_DATE
GIT_AUTHOR_DATE='$newdate'
GIT_COMMITTER_DATE='$newdate'
fi" &&
rm -fr "$(git rev-parse --git-dir)/refs/original/"
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现类似的功能rewrite-commit-message来更改提交消息.我想要的是:
rewrite-commit-message接受两个参数:和commit_id,和new_commit_messagecommit_id知道哪个提交更改git commit --amend,因为这与旧提交有关(不一定与最近的提交有关)git push -ffilter-branch它,但我不知道如何:
test在所使用的rewrite-commit-date功能是用来在env-filter,但我不会做env-filter在这里,因为我不希望改变有关提交环境中任何事物,但提交信息.所以我读了很多关于如何更改以前提交的电子邮件地址但由于某种原因我的更新没有.
我确实喜欢使用我的本地电子邮件(nameofMyComputer@kevin.local)对我的私人仓库进行了40次提交,这很糟糕,因为这封电子邮件与github没有关联(也不可能).
然后我记得我之前需要设置git.config,所以我做了:
git config user.email "newemail@example.com"
Run Code Online (Sandbox Code Playgroud)
并做了一个测试提交,它完美地工作.
有没有办法可以将我以前的所有提交还原到这封新邮件?
我在SO上阅读了这个问题.在Git中更改了作者和提交者名称以及多次提交的电子邮件并使用了它
git filter-branch -f --env-filter "
GIT_AUTHOR_EMAIL='kevin.cohen26@gmail.com';
GIT_COMMITTER_EMAIL='kevin.cohen26@gmail.com';
"
HEAD
Run Code Online (Sandbox Code Playgroud)
但它不起作用......我仍然可以看到我之前提交的电子邮件与.patch扩展名为.local电子邮件地址
git ×10
git-commit ×2
command-line ×1
git-amend ×1
github ×1
macos ×1
merge ×1
rebase ×1
security ×1