我有一个Git存储库,我想看看几个月前一些文件的样子.我在那个日期找到了修改版,而且它是27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8.我需要查看一个文件的外观,并将其保存到文件中.
我设法看到文件使用gitk,但它没有保存选项.我尝试使用命令行工具,我得到的最接近的是:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
Run Code Online (Sandbox Code Playgroud)
但是,此命令显示diff而不是文件内容.我知道我以后可以使用类似的东西PAGER=cat并将输出重定向到文件,但我不知道如何获得实际的文件内容.
基本上,我正在寻找类似svn cat的东西.
如何从git repo中仅查看一个文件?
我正在使用包含大量文件的存储库,这需要几个小时才能结账.我正在研究Git是否能够很好地使用这种类型的存储库,因为它支持稀疏检出,但我能找到的每个示例都执行以下操作:
git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD
Run Code Online (Sandbox Code Playgroud)
这个命令序列的问题是原始克隆也执行结帐.如果将-n添加到原始克隆命令,则read-tree命令会导致以下错误:
错误:稀疏结账不会在工作目录上留下任何条目
如何在不先检出所有文件的情况下进行稀疏结账?
是否有可能只在Git和Mercurial中克隆一个分支(或来自给定的提交)?我的意思是,我想要克隆一个中央回购,但由于它很庞大,我只想获得它的一部分,并且仍能够回馈我的变化.可能吗?比如,我只想从Tag 130开始或类似的东西?
如果是这样,怎么样?
使用Git 1.7.0中新的稀疏结账功能,是否可以像在SVN中一样获取子目录的内容?我找到了这个例子,但它保留了完整的目录结构.想象一下,我只想要'perl'目录的内容,而没有名为'perl'的实际目录.
- 编辑 -
例:
我的git存储库包含以下路径
repo/.git/
repo/perl/
repo/perl/script1.pl
repo/perl/script2.pl
repo/images/
repo/images/image1.jpg
repo/images/image2.jpg
repo/doc/
repo/doc/readme.txt
repo/doc/help.txt
Run Code Online (Sandbox Code Playgroud)
我想要的是能够从上面的存储库中生成这种布局:
repo/.git/
repo/script1.pl
repo/script2.pl
Run Code Online (Sandbox Code Playgroud)
然而,使用当前的稀疏结账功能,似乎只能获得
repo/.git/
repo/perl/script1.pl
repo/perl/script2.pl
Run Code Online (Sandbox Code Playgroud)
这不是我想要的.
我想从已经存在的repo的子文件夹创建一个单独的repo.
将(移动)子目录分离到单独的Git存储库中就可以显示出来.但是,我无法用它获得一个干净的回购.我最终遇到了新回购的两个问题:
这是我做的:
$ git clone ssh://.../repo.git
$ cd repo
$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all
$ git reset --hard
$ git gc --aggressive
$ git prune
Run Code Online (Sandbox Code Playgroud)
在此之后,我似乎拥有了回购和新历史的原始历史.我输入"git log --all --graph"(或gitk --all)我看到,作为第一个提交,第一个repo的初始提交.然后,图表显示原始repo的完整历史记录,直到最后一次提交.然后,我在第一个上面有一个SECOND历史,显示了我想要的子文件夹的历史.但在历史的那一部分,我只有"主人",没有分支/合并.
"git log",gitk或gitg都只显示"flatten"历史记录:它们不会在子文件夹的展平历史之前显示初始回购的历史记录.
我尝试使用"filter-branch"命令,克隆生成的repo(使用--no-hardlinks),使用:
$ git filter-branch --subdirectory-filter subdirectory -- --all
Run Code Online (Sandbox Code Playgroud)
代替:
$ git filter-branch --subdirectory-filter subdirectory HEAD -- --all
Run Code Online (Sandbox Code Playgroud)
但结果相同.
我做错了什么或者git坏了吗?我真的没有想法......使用git 1.7.6.谢谢.
编辑:我认为问题可能来自于filter-branch忽略了merge提交的事实,因此给出了没有分支或合并的平面历史记录......