社区
其他技术讨论专区
帖子详情
git - 获取特定文件/文件夹的所有先前版本
weixin_38053088
2019-09-12 03:29:21
我想检索全部旧版本的特定文件在git存储库中。 我发现使用checkout命令可以得到一个特定的版本,但我希望它们都可以。而具有depth选项的git clone命令似乎不允许我克隆子文件夹(“无效的存储库名称”)。 你知道这是可能的吗? 谢谢
...全文
808
5
打赏
收藏
git - 获取特定文件/文件夹的所有先前版本
我想检索全部旧版本的特定文件在git存储库中。 我发现使用checkout命令可以得到一个特定的版本,但我希望它们都可以。而具有depth选项的git clone命令似乎不允许我克隆子文件夹(“无效的存储库名称”)。 你知道这是可能的吗? 谢谢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
weixin_38065057
2019-09-12
打赏
举报
回复
OP想要检索所有版本,但答案不会实现。特别是如果该文件有数百个修订(所有建议都过于人工)。唯一的半工作解决方案是由@Tobias在注释中提出的,但是建议bash循环会以随机顺序构建文件,以及在对我们的回购使用时会产生数百个空文件。其中一个原因是“rev-list - all --objects”会列出不同的对象(包括树木 - 但对我们的目的无用)。 我从Tobias的解决方案开始,添加了计数器,清理了一下,最终以下面列出的bash脚本的形式重新发明了轮子。 该脚本将: - 提取所有文件版本到/ tmp/all_versions_exported - 以1个参数 - 相对路径git仓库里面的文件 - 给结果档案名称的数字前缀(排序) - 在结果文件提到检查文件名(从橘子:) 分辨苹果 - 提到在结果文件名提交日期(见下面的输出例子) - 不创建空的结果文件 猫在/ usr/local/bin目录/ git_export_all_file_versions 用例: cd /home/myname/my-git-repo git_export_all_file_versions docs/howto/readme.txt result stored to /tmp/all_versions_exported ls /tmp/all_versions_exported 0001.17-Oct-2016.ee0a1880ab815fd8f67bc4299780fc0b34f27b30.readme.txt 0002.3-Oct-2016.d305158b94bedabb758ff1bb5e1ad74ed7ccd2c3.readme.txt 0003.29-Sep-2016.7414a3de62529bfdd3cb1dd20ebc1a977793102f.readme.txt 0004.28-Sep-2016.604cc0a34ec689606f7d3b2b5bbced1eece7483d.readme.txt 0005.28-Sep-2016.198043c219c81d776c6d8a20e4f36bd6d8a57825.readme.txt 0006.9-Sep-2016.5aea5191d4b86aec416b031cb84c2b78603a8b0f.readme.txt <and so on and on . . .> 编辑:如果你看到象这样的错误: 致命的:不是有效的对象名称 3e93eba38b31b8b81905ceaa95eb47bba ed46494:readme.txt 这意味着您已经从git项目的根文件夹启动脚本。
weixin_38073873
2019-09-12
打赏
举报
回复
所有文件的版本已经在git仓库,当你的Git克隆它。您可以创建一个特定的收银台相关联的分支承诺: git checkout -b branchname {commit#} 这可能足以满足变化的快速和肮脏的人工比较: 结帐分支 复制到编辑缓冲区 这可能是好的,如果你只有几个版本需要关注,不介意一点手动,尽管git内置命令。 对于脚本解决方案,在其他答案中已经提供了其他一些解决方案。
weixin_38075729
2019-09-12
打赏
举报
回复
git rev-list --all --objects -- path/to/file.txt 列出了与回购路径 相关联的所有斑点获得文件的特定版本 git cat-file -p commitid:path/to/file.txt (的commitid可以是任何东西 象征REF(分支,标签名称;远程) a commit hash 像HEAD〜3,BRANCH1 @ {4}等进行修订规范
weixin_38102914
2019-09-12
打赏
举报
回复
的文件有时旧版本只能通过git reflog。最近我遇到了一个情况,那就是我需要挖掘所有提交,即使是在交互式重新绑定期间由于意外覆盖而不再是日志的一部分的提交。 我写了这个Ruby脚本来输出文件的所有以前的版本来找到孤立的提交。 grep这个输出很容易找到我丢失的文件。希望它能帮助别人。 #!/usr/bin/env ruby path_to_file = "" `git reflog`.split("\n").each do |log| puts commit = log.split(" ").first puts `git show #{commit}:#{path_to_file}` puts end 同样的事情可以用git log完成。
weixin_38109674
2019-09-12
打赏
举报
回复
德米特里提供的脚本确实解决了这个问题,但它有一些问题导致我使它适应了我的需要。具体来说: 由于我的默认日期格式设置打破了git show的使用。 我希望按日期顺序排序结果,而不是反向日期顺序。 我希望能够针对从回购库中删除的文件运行它。 我不希望所有分支上的所有修订;我只是想从HEAD中获得修改。 我希望它错误,如果它不是在一个混帐回购。 我不想编辑脚本来调整某些选项。 它的工作方式效率低下。 我不需要输出文件名中的编号。 (适当格式的日期可以达到同样的目的。) 我想更安全的“带空格的路径”处理 你可以看到最新的版本我修改in my github repo或这里的精选版本在写这篇文章的: #!/bin/sh # based on script provided by Dmitry Shevkoplyas at http://stackoverflow.com/questions/12850030/git-getting-all-previous-version-of-a-specific-file-folder set -e if ! git rev-parse --show-toplevel >/dev/null 2>&1 ; then echo "Error: you must run this from within a git working directory" >&2 exit 1 fi if [ "$#" -lt 1 ] || [ "$#" -gt 2 ]; then echo "Usage: $0 <relative path to file> [<output directory>]" >&2 exit 2 fi FILE_PATH="$1" EXPORT_TO=/tmp/all_versions_exported if [ -n "$2" ]; then EXPORT_TO="$2" fi FILE_NAME="$(basename "$FILE_PATH")" if [ ! -d "$EXPORT_TO" ]; then echo "Creating directory '$EXPORT_TO'" mkdir -p "$EXPORT_TO" fi echo "Writing files to '$EXPORT_TO'" git log --diff-filter=d --date-order --reverse --format="%ad %H" --date=iso-strict "$FILE_PATH" | grep -v '^commit' | \ while read LINE; do \ COMMIT_DATE=`echo $LINE | cut -d ' ' -f 1`; \ COMMIT_SHA=`echo $LINE | cut -d ' ' -f 2`; \ printf '.' ; \ git cat-file -p "$COMMIT_SHA:$FILE_PATH" > "$EXPORT_TO/$COMMIT_DATE.$COMMIT_SHA.$FILE_NAME" ; \ done echo exit 0 输出的例子: $ git_export_all_file_versions bin/git_export_all_file_versions /tmp/stackoverflow/demo Creating directory '/tmp/stackoverflow/demo' Writing files to '/tmp/stackoverflow/demo' ... $ ls -1 /tmp/stackoverflow/demo/ 2017-05-02T15:52:52-04:00.c72640ed968885c3cc86812a2e1aabfbc2bc3b2a.git_export_all_file_versions 2017-05-02T16:58:56-04:00.bbbcff388d6f75572089964e3dc8d65a3bdf7817.git_export_all_file_versions 2017-05-02T17:05:50-04:00.67cbdeab97cd62813cec58d8e16d7c386c7dae86.git_export_all_file_versions
git
入门级别操作
git
简易操作 让你轻松过关
git
的基本操作 让你轻松发布到远程
git
-tutorials:这只是一个演示
git
这个项目只是一个演示如何使用
git
git
用法简介
非常强大的分布式代码管理工具,Linus Torvalds为了帮助管理Linux kernel而开发的工具。
TortoiseSVN1.7.6中文教程
版本
控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花实践作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队--或许是同时工作在同一个
文件
!--你就会明白为什么一个好的系统需要管理潜在的混乱。
A thin MATLAB wrapper for the
Git
source control system.zip
A thin MATLAB wrapper for the
Git
source control system
其他技术讨论专区
473
社区成员
791,201
社区内容
发帖
与我相关
我的任务
其他技术讨论专区
其他技术讨论专区
复制链接
扫一扫
分享
社区描述
其他技术讨论专区
其他
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章