如何将当前提交设置为 Git 仓库的唯一(初始)提交?

885

我目前有一个本地Git仓库,我将其推送到Github仓库。

本地仓库有大约10个提交,而Github仓库是这些提交的同步副本。

我想做的是从本地Git仓库中删除所有版本历史记录,以便仓库中只显示当前内容作为唯一提交(因此不会存储仓库内文件的旧版本)。

然后,我想将这些更改推送到Github。

我已经调查了Git rebase,但这似乎更适用于删除特定版本。 另一个潜在的解决方案是删除本地仓库并创建一个新的 - 虽然这可能会创建很多工作!

预计完成时间:有一些特定目录/文件未被跟踪 - 如果可能的话,我希望保持对这些文件的未跟踪。


6
请参考 https://dev59.com/t3RC5IYBdhLWcg3wAcbU (“如何合并 Git 仓库的前两个提交?”) - Anonymoose
可能相关: 如何将Git仓库的前两个提交合并? - user456814
如何将所有的git提交压缩成一个? - ryenus
请参见 https://stackoverflow.com/a/66091688/8079868 - anon
18个回答

4

git filter-branch 是一种强大的大手术工具,与 git 相关的技术。

git filter-branch --parent-filter true -- @^!

--parent-filter参数从标准输入获取父提交记录,应该将重写后的父提交记录打印到标准输出;Unix命令true成功退出并且不会打印任何内容,因此没有父提交记录。 @^!Git缩写,“表示最新提交但不包括其任何父提交”。然后删除所有其他引用,并随意推送。


3
以下是清除Github存储库历史记录的步骤:
首先,从.git中删除历史记录。
rm -rf .git

现在,只需使用当前内容重新创建 git 仓库即可。
git init
git add .
git commit -m "Initial commit"

将代码推送到Github远程仓库,确保覆盖历史记录


git remote add origin git@github.com:<YOUR ACCOUNT>/<YOUR REPOS>.git
git push -u --force origin master

1
这个回答与社区Wiki的回答有什么不同之处,或者又增加了哪些价值? - derekbaker783

3

所有的答案都很棒,但我想用简单的命令来尝试另一种方法。

git clone --depth 1 <remote-url> .
git commit --amend -m <commit message you want>
git push --force

2

1
谢谢您。只是提醒一下:您用于清除每个分支历史记录的脚本可能需要更新 - 它会出现以下错误:git-hash: not foundSupport for <GIT_DIR>/info/grafts is deprecated - Shafique Jamal
1
@ShafiqueJamal,谢谢,小的“git-hash”脚本是git log HEAD~${1:-0} -n1 --format=%H,在这里,http://sam.aiki.info/b/git-hash 最好将其放在一个脚本中供公众使用。如果我再次使用它,我可能会想出如何使用替换“grafts”的新功能来完成它。 - Sam Watkins

2

Here you go:

#!/bin/bash
#
# By Zibri (2019)
#
# Usage: gitclean username password giturl
#
gitclean () 
{ 
    odir=$PWD;
    if [ "$#" -ne 3 ]; then
        echo "Usage: gitclean username password giturl";
        return 1;
    fi;
    temp=$(mktemp -d 2>/dev/null /dev/shm/git.XXX || mktemp -d 2>/dev/null /tmp/git.XXX);
    cd "$temp";
    url=$(echo "$3" |sed -e "s/[^/]*\/\/\([^@]*@\)\?\.*/\1/");
    git clone "https://$1:$2@$url" && { 
        cd *;
        for BR in "$(git branch|tr " " "\n"|grep -v '*')";
        do
            echo working on branch $BR;
            git checkout $BR;
            git checkout --orphan $(basename "$temp"|tr -d .);
            git add -A;
            git commit -m "Initial Commit" && { 
                git branch -D $BR;
                git branch -m $BR;
                git push -f origin $BR;
                git gc --aggressive --prune=all
            };
        done
    };
    cd $odir;
    rm -rf "$temp"
}

此外,这里也托管了:https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743


啊!不要让我在命令行提供我的未隐藏、未保护的密码!此外,git branch 的输出通常不适合用于脚本编写。你可能需要查看一下 plumbing 工具。 - D. Ben Knoble

-1

我通过从我的项目中删除.git文件夹并通过IntelliJ重新集成版本控制来解决了类似的问题。 注意:.git文件夹是隐藏的。您可以使用ls -a在终端中查看它,然后使用rm -rf .git将其删除。


他在第一步做的是什么:rm -rf .git? - nights

-1

为此,请使用Shallow Clone命令git clone --depth 1 URL - 它只会克隆存储库的当前HEAD


-3
要从git中删除最后一次提交,您可以简单地运行以下命令:
git reset --hard HEAD^ 

如果您要从顶部删除多个提交,则可以运行:
git reset --hard HEAD~2 

要删除最后两个提交。您可以增加数字以删除更多提交。 此处有更多信息。 Git教程提供了如何清除存储库的帮助:
您想从历史记录中删除文件并将其添加到.gitignore中,以确保不会意外重新提交。对于我们的示例,我们将从GitHub gem存储库中删除Rakefile。
git clone https://github.com/defunkt/github-gem.git

cd github-gem

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch Rakefile' \
  --prune-empty --tag-name-filter cat -- --all

既然我们已经从历史记录中删除了该文件,那么让我们确保不会再次意外提交它。
echo "Rakefile" >> .gitignore

git add .gitignore

git commit -m "Add Rakefile to .gitignore"

如果您对存储库的状态感到满意,您需要强制推送更改以覆盖远程存储库。
git push origin master --force

9
从存储库中删除文件或提交与问题无关(该问题要求删除历史记录,这是完全不同的事情)。提问者想要一个干净的历史记录,但希望保留存储库当前的状态。 - Victor Schröder
1
这并不会产生问题所要求的结果。您正在丢弃提交后的所有更改,并且丢失了此时之后的所有更改,但是问题要求保留当前文件并删除历史记录。 - Tuncay Göncüoğlu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接