文章目录
场景说明
- 我不想checkout到覆盖本地工作区的文件, 而是想把该
- 版本checkout到另外一个文件夹下,检出看看,这个文件夹不被git管理
方案一:git archive 最简单省事
# `git archive` 创建对应版本 当前目录下的文件为一个tar文件# `tar -x -C` 加压文件到指定位置git archive <commit_hash>|tar-x-C<new_folder>
将 <commit_hash> 替换为你想要检出的具体commit的哈希值,<new_folder> 替换为你想要保存文件的新文件夹路径。
这条命令会创建一个对应版本的tar临时归档文件,并将其解压到指定的新文件夹中,保持原来的文件结构。
注意:
- 执行这条命令应在git仓库的根目录下,否则得到的只有当前目录下的文件
- 你需要确保 <new_folder> 不存在,或者是一个空文件夹,否则会报错。
如果打包时不想对某些文件/文件夹打包,可以创建一个.gitattributes文件(但是只有含有这个文件的commit,打包时才能忽略,对历史版本打包时无效),并在其中添加
export-ignore
属性,比如:
# 这三个东西打包时将被忽略
.gitignore export-ignore
.gitattributes export-ignore
/result export-ignore
方案二:git show 最灵活, 但文件较多时麻烦
另一个方案是利用
git show
结合重定向
>
逐个检出文件,比如:
git show 94119e2:test.py > test_v1.0.py
,有多个文件的话就逐个执行。
方案三:
git --work-tree
有bug
方案:通过指定--work-tree=/path/to/dist 可实现目标功能
git --work-tree=/d/mycode/test_git/labs/2053 checkout 3d9862a -- .
其中:
• git checkout 3d9862a -- .
○ 检出指定版本的所有文件
○ `.`表示所有文件, 也可以换成某个文件/文件夹
• --work-tree=/d/mycode/test_git/labs/2053
○ 用于指定检出到的位置,该路径必须存在
○ 如果该路径下已有文件,则会直接覆盖
执行这个命令之后会把你的文件变成not staged for commit, 然后执行
git add
就可以了,不需要再commit.
版权归原作者 Y Shy 所有, 如有侵权,请联系我们删除。