Git:如何克隆第一次提交?

ign*_*low 16 git

谁能告诉我如何克隆第一次提交?我不想删除最近的提交,只需制作初始状态的克隆副本,这样我就可以获取一些文件.

mpe*_*mpe 14

更新2018答案:使用您自己的符号引用,即.标签.并开始使用describe和注释标签.

git tag -a -m "Initial version" root $( git rev-list --all | tail -n 1 )
git describe
Run Code Online (Sandbox Code Playgroud)

自2011年以来从未收到过标记但偶尔承诺使用以上标记的回购的输出描述:

root-1090-g88a80e93
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想丢弃所有其他历史,我从来不需要它,复制初始集就很容易了.如果你想引用原始的"root"提交和邮票,我可以看到用例.也许看看如何ie.BFG的工作,--depth还是GIT 2.19的新功能clone --filter.[3]


我想我想做同样的事情.签出初始提交,然后从那里进行分支.我不确定接受了答案.但我想它可以(部分)满足原始问题.读完这个帖子后,我会用一些bash脚本来进行

git log --pretty=oneline  master | tail -1
Run Code Online (Sandbox Code Playgroud)

我希望会有一些提交或树形参考.也许列出标记为root的节点,但我认为GIT本身并不跟踪这个.因此,此方法仅适用于只有一个根提交的存储库.

2017年和2018年的更新是git log有一个更好的选择,使用git rev-list但是遇到了同样的问题.他们只是使用提交列表的尾随项目.

您可以检查只有一个根目录的存储库的"根提交",它适用于大多数存储库.但这是一个hack,最好检查一下系统为什么以及在哪里标记root提交.只需标记或记录即可.

您可以使用以下命令检查具有一个根的repo中的第一个提交:

git checkout $( git rev-list --all | tail -n 1 )
Run Code Online (Sandbox Code Playgroud)

或(GIT <1.8.1):

git checkout $( git log --pretty=oneline | tail -n 1 | sed 's/ .*$//' )
Run Code Online (Sandbox Code Playgroud)

请参阅git-revlist以及使用git,如何返回第一次提交然后浏览历史记录?.

[3]:

  • 如果你使用`git rev-list --all`而不是`git log --pretty = oneline master`,你就不必解析提交消息,因为它只返回shas.请参阅我的回答[使用git,我该如何回到第一次提交](http://superuser.com/a/773366/180163) (3认同)

Mic*_*son 13

如果通过"first commit",你的意思是一个没有任何父项的分支的父提交,那么你想使用git-rev-list来做到这一点.只是用

git rev-list --max-parents=0 HEAD

这将获得当前HEAD的"初始提交".如果列出,则使用master,或任何其他子修订规范.将其包装$(...)以便在表达式中使用它,例如:

git checkout $(git rev-list --max-parents=0 HEAD)

  • 谢谢,这是唯一一个涵盖一般情况而没有中间复制/粘贴步骤的答案. (2认同)

Cas*_*bel 9

要回答这个问题,我想你想问一下:

您可以将整个存储库置于第一次提交的状态:

git checkout <commit SHA1>
Run Code Online (Sandbox Code Playgroud)

在你搞砸了之后,你可以git checkout master回到原来的位置.

您可以从第一次提交中将单个文件放入其状态:

git checkout <commit SHA1> <file or directory> ...
Run Code Online (Sandbox Code Playgroud)

再一次,在你完成之后,你可以做到git checkout master <file or directory>回到原来的位置.

没有必要"克隆"一个提交(我假设你的意思是克隆存储库,并检查第一次提交?).当然,如果由于某种原因你不能修改你的存储库中的任何文件(例如,不想让你的构建过期)你当然可以克隆它,然后在克隆的repo中做同样的事情.