我目前有一个本地Git存储库,我将其推送到Github存储库.
本地存储库有~10个提交,Github存储库是这个的同步副本.
我想要做的是从本地Git存储库中删除所有版本历史记录,因此存储库的当前内容显示为唯一的提交(因此存储库中的旧版本文件不会存储).
然后,我想将这些更改推送到Github.
我已经调查了Git rebase,但这似乎更适合删除特定版本.另一个可能的解决方案是删除本地仓库,并创建一个新的仓库 - 虽然这可能会创造很多工作!
ETA:有一些未跟踪的特定目录/文件 - 如果可能的话,我想保持这些文件的跟踪.
随着git rebase --interactive <commit>你能够压制任意数量的提交连成一个单一的一个.
除非你想将提交压缩到初始提交中,否则这一切都很棒.这似乎是不可能的.
有没有办法实现它?
在一个相关的问题中,我设法提出了一种不同的方法来解决第一次提交的问题,这也就是说,它是第二次提交.
如果您有兴趣:git:如何插入提交作为第一个,转移所有其他?
我创建了新的分支master:
git checkout -b testbranch
我做了20次提交.
现在我要压缩那20个提交.我这样做:
git rebase -i HEAD~20
如果我不知道有多少提交怎么办?有什么方法可以做以下事情:
git rebase -i all on this branch
假设您有一个包含三个提交A,B和C的历史记录:
A-B-C
Run Code Online (Sandbox Code Playgroud)
我想将两个提交A和B组合到一个提交AB:
AB-C
Run Code Online (Sandbox Code Playgroud)
我试过了
git rebase -i A
Run Code Online (Sandbox Code Playgroud)
这打开了我的编辑器,其中包含以下内容:
pick e97a17b B
pick asd314f C
Run Code Online (Sandbox Code Playgroud)
我改成这个
squash e97a17b B
pick asd314f C
Run Code Online (Sandbox Code Playgroud)
然后Git 1.6.0.4说:
Cannot 'squash' without a previous commit
Run Code Online (Sandbox Code Playgroud)
有办法还是不可能?
如何重置远程和本地GIT存储库以删除所有提交,并以当前Head作为初始提交重新开始.
我们有一个拥有超过400个提交的Git存储库,其中前几个是很多试错.我们希望通过将许多提交压缩到单个提交来清理这些提交.当然,git-rebase似乎还有很长的路要走.我的问题是它最终会出现合并冲突,而这些冲突并不容易解决.我不明白为什么会有任何冲突,因为我只是压缩提交(不删除或重新排列).很可能,这表明我并不完全理解git-rebase是如何做它的南瓜的.
这是我正在使用的脚本的修改版本:
repo_squash.sh(这是实际运行的脚本):
rm -rf repo_squash
git clone repo repo_squash
cd repo_squash/
GIT_EDITOR=../repo_squash_helper.sh git rebase --strategy theirs -i bd6a09a484b8230d0810e6689cf08a24f26f287a
Run Code Online (Sandbox Code Playgroud)
repo_squash_helper.sh(此脚本仅由repo_squash.sh使用):
if grep -q "pick " $1
then
# cp $1 ../repo_squash_history.txt
# emacs -nw $1
sed -f ../repo_squash_list.txt < $1 > $1.tmp
mv $1.tmp $1
else
if grep -q "initial import" $1
then
cp ../repo_squash_new_message1.txt $1
elif grep -q "fixing bad import" $1
then
cp ../repo_squash_new_message2.txt $1
else
emacs -nw $1
fi
fi
Run Code Online (Sandbox Code Playgroud)
repo_squash_list.txt :(此文件仅由repo_squash_helper.sh使用)
# Initial import
s/pick \(251a190\)/squash …Run Code Online (Sandbox Code Playgroud) 我有两个不相关的分支,主人和配置的git repo.我创建了配置,清除了所有文件,然后只放入配置文件中.现在我想在远程仓库上推送它,但因为它是新的,空分支(没有我所有更改的日志和原始分支的旧版本).
我怎样才能清除所有的历史并推动它?
所以我和一些朋友一起工作,我们都是git的新手,其中一个提交了大量的外部二进制文件,这会减慢存储库的速度,占用大量的磁盘空间.
我们刚刚启动了这个项目,所以除了自述文件外没有什么重要的.所以我们要做的是将存储库历史记录清除到当前状态.
So basicly it looks this:
Head -> A -> B -> C total disk size 45 MB, 1 file, 300 deleted files
And we want this:
Head -> A total disk size 1 kB, 1 file, 0 deleted files
Run Code Online (Sandbox Code Playgroud)
显而易见的解决方案是创建一个新的存储库,然后将自述文件复制到新的存储库中.但是,如果有GIT命令可以做到这一点,我想学习教育/好奇心.
我一直在试验Rebase命令,但它似乎仍然保留了旧的历史记录及其数据,这让我感到困惑,因为如果重新绑定不会从存储库中删除数据,那么您可能也不会使用它.
我一直在谷歌搜索其他一些关于这个问题的帖子,我怀疑你不能用git这样做.但是我想证实这一点.
是的,它是github上的远程目录
谢谢你的帮助.
所以对于我的解决方案,我选择这样做:
rebase using tortoisegit
squash all commits
then using git bash:
git reflog expire --all --expire-unreachable=now
git gc --aggressive --prune=now
git push origin master --force
Run Code Online (Sandbox Code Playgroud)
看起来本地存储库历史记录不希望缩小磁盘大小.但是,再次克隆存储库会显示所需的结果和磁盘大小.存储库日志也是如此.
感谢您的回复.有趣的Rebase似乎非常强大.
我正在寻找一种方法将所有git 提交压缩到master分支中的单个大提交中。我完全理解我试图做的事情的后果,不需要解释这是危险的或者不是正确的方法 - 我想丢失我所有的历史并将这个存储库变成一个单一的大提交。
主要问题是:我没有其他活动分支,没有本地提交,并且之前的所有提交都已经推送到 remote master。
也欢迎使用 Hacky 脚本。
git ×10
git-rebase ×3
rebase ×2
squash ×2
git-branch ×1
git-checkout ×1
git-commit ×1
git-merge ×1
git-squash ×1
github ×1