我想在这个git存储库中定义一个新的"root"分支."root"分支是指完全独立于存储库1中所有其他分支的分支.
不幸的是,甚至在Arepo的提交树的基础上提交(让我们称之为)包含很多文件(这是一个在已经相当成熟的项目上初始化的存储库).
这意味着即使我A作为新分支提供<start-point>,这个新分支也不会从"干净的平板"开始,而是包含所有提交的文件A.
有没有什么方法可以在这个存储库中创建一个完全裸的分支,<start-point>尽可能接近A?
1 BTW,这不等于创建一个新的回购.由于很多原因,单独的回购将不太方便.
编辑:好的,这是我做的,基于vcsjones的回答:
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
Run Code Online (Sandbox Code Playgroud)
虽然这个过程有点涉及,但最终结果是一个空的基本提交,可以作为<start-point>任何新的"clean-slate分支"; 那时我需要做的就是
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
Run Code Online (Sandbox Code Playgroud)
在将来,我将始终创建这样的新存储库:
git init
git commit --allow-empty -m 'base commit (empty)'
Run Code Online (Sandbox Code Playgroud)
...以便第一次提交为空,并始终可用于启动新的独立分支.(我知道,这将是一个非常需要的设施,但它很容易让它随时可用.)
vcs*_*nes 207
使用--orphan创建分支时:
git checkout --orphan YourBranchName
Run Code Online (Sandbox Code Playgroud)
这将创建一个零提交的新分支,但是所有文件都将被暂存.那时你可以删除它们.
("删除它们":A git reset --hard将清空索引,留下一个空的工作树)
看看该手册页结帐关于--orphan更多信息.
Von*_*onC 10
有什么方法可以在这个存储库中创建一个完全裸露的分支。
实际使用的命令(使用 Git 2.28+)是:
git switch --discard-changes --orphan newBranch
# or
git switch -f --orphan newBranch
Run Code Online (Sandbox Code Playgroud)
git switch从 Git 2.23(2019 年 8 月)开始可用,并取代了旧的令人困惑的git checkout命令。
但我会推荐 Git 2.28 (Q3 2020),因为git switch --discard-changes --orphan该版本已经进行了优化。
请参阅brian m的提交 8d3e33d、提交 8186128(2020 年 5 月 21 日) 。卡尔森 ( bk2204) .
(由Junio C Hamano 合并 -- gitster--在ded44af 提交中,2020 年 6 月 9 日)
builtin/checkout:简化元数据初始化签字人:brian m. 卡尔森
审稿人:Derrick Stolee当我们调用时,
init_checkout_metadata我们reset_tree,想要传递相关提交的对象 ID,以便可以将其传递给过滤器,或者如果没有提交,则传递给树。我们预料到后一种情况可能会发生在结账代码的其他地方,但不能发生在这里。
我们没有提交对象的唯一情况是调用
git switchwith时--orphan。此外,我们只能在没有提交对象的情况下使用 或 来访问此代码
--force路径--discard-changes。在这种情况下,使用提交或树初始化签出元数据是没有意义的,因为
- (a) 没有提交,只有空树,并且
- (b) 我们永远不会使用这些数据,因为在检出没有文件的分支时不会弄脏任何文件。
在本例中传递全零对象 ID,因为我们只需要一些作为有效指针的值。
测试:
git switch master
echo foo >foo.txt
git switch --discard-changes --orphan new-orphan2
git ls-files >tracked-files
# test_must_be_empty tracked-files
Run Code Online (Sandbox Code Playgroud)
要添加到已接受的答案 - 恢复到清洁状态的最佳做法是创建一个初始的空提交,以便在为子孙后代设置分支时轻松进行重新设置.此外,由于您需要一个干净的状态,您可能已经提交了不应该提交的文件,因此您必须从索引中删除它们.考虑到这些,你应该:
$ git checkout --orphan dev2
Switched to a new branch 'dev2'
$ git reset # unstage all the files, you probably don't want to commit all of them
$ git commit --allow-empty -m 'Initial empty commit'
[dev2 (root-commit) a515c28] Initial empty commit
Run Code Online (Sandbox Code Playgroud)
如果您使用 git 2.23 或更高版本,您可能会习惯使用git switch和git restore而不是git checkout. 如果是这样,该标志与此答案中提到的相同。
git switch --orphan YourBranchHere
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
30346 次 |
| 最近记录: |