标签: git-rewrite-history

从历史记录中删除不需要的文件,包括带有filter-branch的所有引用

我最近克隆了一个SVN存储库,它曾经有一些二进制文件,不再需要它们了.不幸的是,我已经把它推到了Github,其中包含了二进制文件.我现在想要使用'git filter-branch'删除它们,但是当涉及到标签和分支时我遇到了一些问题.

基本上,我创建了一个简单的shell脚本来删除已由以下命令确定的文件列表:

git rev-list --objects --all | grep .jar > files.txt
Run Code Online (Sandbox Code Playgroud)

删除脚本如下所示:

#!/bin/sh
while read file_hash file_to_remove
do
    echo "Removing "$file_to_remove;
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $file_to_remove"
    rm -rf .git/refs/original/;
    git reflog expire --all --expire-unreachable=0;
    git repack -A -d;
    git prune
done < $1
Run Code Online (Sandbox Code Playgroud)

我有一些标签(全部列在.git/packed-refs中),一个.git/refs/remotes/origin(指向Github repo).使用上面的脚本删除文件没有想要的效果('du -cm'仍然输出相同的大小;'git rev-list'仍然列出文件),直到我手动删除.git/packed中的所有引用-refs和.git/refs/remotes/origin目录.

当然,我正在丢失所有标签以及使用这种方法将我的本地更改推回给Github的可能性.有什么我错过了或有没有其他方法从所有分支/标签中删除文件而不破坏我的历史记录?

非常感谢,Matthes

git git-svn git-filter-branch git-rewrite-history

3
推荐指数
1
解决办法
2013
查看次数

如何更改所有 git 消息提交中的特定字符串?

我想 grep 并更改推送到 Github 的所有消息中的特定字符串。是否可以?如何?我知道如何更改最后一条消息git commit --amend,但我想更改所有提交的所有消息。

git version-control github rebase git-rewrite-history

3
推荐指数
1
解决办法
1855
查看次数

Git:如何重写远程历史记录?

一位同事意外提交了一个大型二进制文件,该文件没有源控制权,因此导致存储库异常大。然后,他将该提交推送到公共服务器,此后又进行了其他一系列提交和推送。我正在寻找一种撤消提交的方法,或者只是从远程计算机上删除该二进制文件,以使存储库恢复到通常的大小。

我们常见的远程站点位于assembla.com,因此我没有直接的shell访问权限,只有git。

假设这是可能的,那么对其他下游节点的后果是什么?每个人都需要克隆一个新的存储库吗?(如果这样的话,那很好)

git git-rewrite-history

3
推荐指数
1
解决办法
3280
查看次数

删除Visual Studio Online中的中间提交

我多次编辑README.md,因为我没有看到预览按钮.现在我的提交历史记录中充满了无用的提交.

我可以删除其中的一些,或者至少隐藏它们吗?

git git-rewrite-history tfvc azure-devops

3
推荐指数
1
解决办法
8411
查看次数

修复旧 Git 提交中的许可证

我现在有一个私有的 GitHub 存储库,它已经存在了几年。在README.md文件中有一个许可证,它不再准确。

现在我想把这个私人回购变成一个公共回购,拥有固定的许可证。无论如何,所有旧的提交仍然包含旧的(错误的)许可证。

我怎么能解决这个问题?我的第一个想法是将存储库压缩为单个提交并销毁其他所有内容,但也许有更好的方法来实现我想要的。

正如您从另一个问题中看到的那样,保留历史记录并不重要,但 OTOH 也不会受到伤害。

真正令人痛苦的是使用错误的许可证进行旧提交。

有任何想法吗?

PS:我想确保没有人能够获得旧的提交,即使他们知道提交的 ID。所以,解决这个问题也要注意更新远程仓库,比如GitHub。

git github git-rewrite-history

3
推荐指数
1
解决办法
443
查看次数

如何解决上游分支的强制推送问题?

我有一个branchX用作some-remote/base-branch其上游分支的功能分支。我刚刚发现some-remote/base-branch它的历史被强制推动改写了。涉及哪些问题以及如何解决?

git git-push git-rebase git-rewrite-history

3
推荐指数
1
解决办法
369
查看次数

从github中删除文件

我已经在一段时间内将github用于一个项目,但仅作为问题跟踪器.因此,今晚我花了一些时间来处理代码,并且犯了一个菜鸟错误:我提交了凭据文件和其他不必要的数据.我现在已经将这些添加到.gitignore文件中,它们应该不再是问题,但我发现它们在历史记录中可用.

这带来了安全问题,因此我必须对其进行排序并删除那些敏感数据.我是目前唯一的开发人员,所以这就是为什么我只在我的电脑和实际的服务器上保存代码,但也希望得到这个.

到目前为止,我已经尝试了这篇文章,发现了一些关于SO的问题,但是还没有弄明白这一点.我大多得到一些像这样的错误:fatal: ambiguous argument 'rm': unknown revision or path not in the working tree.

我会删除整个仓库,但我有很多跟踪数据的问题,所以我需要保留它,所以这不是一个选项.我不介意其他提交,我可以从头开始使用本地机器的代码,但需要一些方法来丢失旧的提交及其完整的历史记录,或者更改这些文件(有些东西在.gitignore目录中,所以可能非常繁琐的删除).

我尝试过git rebase -i,但在那里我只看到我的最后三次提交(测试),没有推,其余的在线,其中10个左右没有显示.

我使用的回购是私有的,我和客户只能访问,所以没有第三方看到这个.

我是git的新手,谢谢你的时间和帮助!

git github rebase git-rewrite-history

2
推荐指数
1
解决办法
479
查看次数

git: --prune-empty 使用 bfg 重复提交后

我正在使用bfg从(克隆)git 存储库中删除一些子目录:

java -jar bfg-1.12.12.jar --delete-folders {folder1,folder2,folder3} --no-blob-protection myrepo.git/
git reflog expire --expire=now --all && git gc --prune=now --aggressive
Run Code Online (Sandbox Code Playgroud)

这工作正常,但在我使用 bfg 之后,我有很多空提交(即带有漂亮日志消息的提交但没有更改,因为它们只涉及现在已删除的文件)。

所以下一步我尝试使用

git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD
Run Code Online (Sandbox Code Playgroud)

或者

git filter-branch --prune-empty --tag-name-filter cat -- --all
Run Code Online (Sandbox Code Playgroud)

两个版本都没有预期的效果(删除空提交)。

相反,我最终得到的是一个存储库(见下面的截图,左边是修剪前,右边是修剪后):

  1. 一些空提交已被删除
  2. 大多数空提交仍然存在
  3. 非空提交在单独的提交序列中重复

在此处输入图片说明

有什么建议吗?

git git-rewrite-history bfg-repo-cleaner

2
推荐指数
1
解决办法
1955
查看次数

大量git历史记录重写后如何同步本地历史记录?

这个问题似乎很奇怪,但是重写100次以上的提交后,我在同步git历史记录时遇到了问题。

在我确实重写过的机器上,一个简单的git fetch同步了所有内容。

在另一台Mac机器上,git sync没有帮助,但是在随机删除本地.git/日志和refs文件然后发出后git pull,历史记录得到了刷新。

但是,无论我在Windows计算机上做什么,都无法刷新项目历史记录。尝试了所有:

  • git reset --hard HEADgit fetch
  • git fetch --all
  • git pull
  • 等等

每次在Windows计算机上,我都会获得与另一作者相同的提交的重复条目(更改了Author字段)。

我使用本教程重写了大量历史记录:

https://help.github.com/articles/changing-author-info/

Open Terminal.

Create a fresh, bare clone of your repository:

git clone --bare https://github.com/user/repo.git
cd repo.git
Copy and paste the script, replacing the following variables based on the information you gathered:

OLD_EMAIL
CORRECT_NAME
CORRECT_EMAIL

#!/bin/sh

git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" …
Run Code Online (Sandbox Code Playgroud)

git git-rewrite-history

2
推荐指数
1
解决办法
1700
查看次数

--preserve-合并当前分支中所有提交的交互式rebase

似乎已经有一些类似的问题,但是这些都不是我想要的。

假设我有这样的提交历史

* xxxxxxxH (HEAD -> B) Latest commit
* (more commits)
* xxxxxxxG (B) More commits
*   xxxxxxxF Merge branch 'master' into B
|\  
| * xxxxxxxE (master) Another commit on master
| * (more commits here)
| * xxxxxxxD Commit on master
* | xxxxxxxC Another commit 
* | (more commits here)
* | xxxxxxxB First commit on branch A
|/  
* xxxxxxxA (master) some commit
Run Code Online (Sandbox Code Playgroud)

现在,我想重写分支A的历史记录,可能合并或编辑某些提交,但是我也想更改分支A上的第一次提交,并且我想保留合并,以便将master合并到A中。

我首先进行了直观的尝试git rebase -i -p xxxxxxxB,但是很明显,其中不包含xxxxxxxB提交本身。因此,另一尝试git rebase -i -p …

git rebase git-rewrite-history

2
推荐指数
1
解决办法
1324
查看次数