如何追踪修订历史记录?

2023-12-19

我正在开发一个编程教程项目,我希望本教程的示例源代码具有有意义的修订历史记录,与教程的进度相关。不可避免的是,我不会在第一次就完全正确地获得所有教程提交,并且我不希望修订历史记录中充斥着我以元方式修改教程提交的提交。我认为这意味着我需要两个级别的版本控制:一个与教程的用户相关的内部版本控制,以及一个跟踪我如何重写内部版本的历史的外部版本控制。

我从其他问题中看到(例如'是否可以在另一个 git 存储库中拥有一个 git 存储库 https://stackoverflow.com/questions/7150424/is-it-possible-to-have-a-git-repo-inside-another-git-repo')Git 会忽略子目录中的 .git。这似乎排除了 git 至少用于我的版本控制级别之一。

谁能推荐一种跟踪内容更改和历史重写的策略?


我可以想到两种方法来做到这一点,两种方法都使用一些管道,其中现有的瓷器是在考虑其他因素的情况下建造的。

The first way's easiest but I only recently learned it was even possible1 and suspect some experienced git users will regard it as a monstrosity. The thing is, here it's a very useful monstrosity, and in past debates between the two characterizations "useful" has sometimes proved more ... useful. So:


第一种方法:

You can directly track content that is also tracked in nested repositories. Once git is tracking any content within a directory it will completely2 ignore any repository you subsequently create there.

从你的问题看来,你已经得到了整齐可分割的部分,因此,从顶部开始:

使用存根(或当前)初始内容创建一个完全普通的存储库

# from the top:

# create and commit the empty skeleton
git init book
cd !$
mkdir -p sect{1,2,3}
touch {.,!$}/.gitignore
# copy in any initial content here
git add .
git ls-files -s # to see exactly what you've done so far
git commit -m 'initial skeleton'

创建子存储库以独立跟踪各个部分

# now git is directly tracking content in each section, and commands in the 
# parent will _ignore_ the existence of any nested repositories you subsequently 
# create, but not there worktrees (because of the existing tracked content). viz.:

( cd sect1
  git init 
  git add . 
  git commit -m 'initial skeleton'
  git branch publishing-history
)
^1^2
^2^3

独立、自由地完成每个部分

现在,您可以在多个存储库中跟踪这些部分,并且可以完全独立地处理每个部分:

cd sect1
# work work commit commit lalala
# ... do whatever in the other repos

发布所有部分的合并当前内容

现在是时候发布每个子目录中的当前内容了。将他们的内容全部清理以供发布,并且从其中任何一个中,只需一次,即可

cd ..
git add -A .
git commit
published=`git rev-parse HEAD`

你完成了。如何记录行为:

将各部分的动作记录下来,以供参考

for section in sect*; do
    cd $section
    git update-ref refs/heads/publishing-history $(
        # log where the checked-out commit was published
        git commit-tree \
                  -p publishing-history \
                  -p `git rev-parse HEAD` \
                  -m "## published in main repository commit $published ##" \
                HEAD^{tree}  # just `HEAD:` will work too
    )
    cd ..
done

您选择发布的提交或发布顺序没有任何限制。这就是为什么 Linus 称 git 为“愚蠢的内容跟踪器”:核心没有抽象。分支正确记录了这些提交的顺序、内容和祖先。

便捷链接提交树 https://www.kernel.org/pub/software/scm/git/docs/git-commit-tree.html and 更新参考 https://www.kernel.org/pub/software/scm/git/docs/git-update-ref.html.

建立重写的独立出版历史

git symbolic-ref HEAD refs/heads/newmaster

并如上所述发布您喜欢的任何签出提交序列。这publish-history分支将如实地准确记录您发布的内容和时间。


你可以看到这是怎么回事,对吧?您可以从提交的内容构建任意历史记录commit-tree and update-ref。如果父存储库中的提交顺序不是您想要的,请通过直接提交正确的树顺序将其替换为您想要的完全不同的历史记录。要在父存储库中记录单独的注释,也可以在其上使用发布历史记录构造。

请注意:如果您开始进行大量的历史重写,并且构建新序列所涉及的检查开始显得很繁重,那么 git 可以帮助您。从gitcore-教程 https://www.kernel.org/pub/software/scm/git/docs/gitcore-tutorial.html当你准备好时。


第二种方法

这种方式通过从完全独立的存储库获取和操作树而不是使用上面的覆盖存储库方法来替换“发布组合当前内容”步骤。然后发布步骤是

cd ../main
git read-tree --empty
for repo in sect{1,2,3}; do
    ( cd ../$repo
      tag -f fetchme HEAD^{tree}
    )
    git fetch ../sect1 fetchme
    git read-tree -m --prefix=sect1 FETCH_HEAD
done
git commit

但这有一个缺点,即您不仅必须显式同步重复的工作树,还必须显式同步工作树的更多副本,以启用任何整个项目测试,而不必发布(如上所述)您要测试的每个版本。

也许这只是一种精神状态的问题,但这种方式看起来很笨拙,我认为不值得追求。


散记:

  • git clean -dfx不会清除嵌套存储库的工作树,git 显然只忽略嵌套的.git当它有用时。唔。这可能会被以有用的方式滥用。

  • 如果您想保护您的嵌入式存储库免受随机影响rm -rf sect3你可以使用这个方法git submodule uses,

    mv .git /someplace/safer
    echo gitdir: /someplace/safer >.git
    

以及核弹之后的重建mkdir -p and echo

  • 有人可能会找到一种更优雅的方法来做到这一点,如果是这样,我希望至少能很快出现它的草图;我在上面没有看到任何内容,但我确实倾向于过度设计事物,然后将其全部煮沸。

1 See here for the question that taught me this was possible https://stackoverflow.com/q/23668981/1290731

2 It turns out that git clean does recognize the nested repositories, and doesn't clean them. So git clean -dfx is still safe. More useful behavior :-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何追踪修订历史记录? 的相关文章

  • 如何使用 vim 作为“git show”编辑器?

    全部如所述如何使用 vim 作为 git log 编辑器 https stackoverflow com questions 16666009 how do i use vim as git log editor不适用于 git show
  • TeamCity 将功能分支推送到主分支

    有没有办法将成功构建的功能分支推送到另一个分支 我想要这样的东西 Git 存储库 Gitorious GitHub 等 分支机构 master 当前项目的代码 质量保证 代码等待 QA 的分支 功能分支 许多远程分支 开发人员可以在其中开发
  • Eclipse 在源代码管理中保存操作

    我们希望找到一种在签入之前执行代码标准的 轻量级 方法 我们真的很喜欢使用 Eclipse 内置的想法保存操作 go to Preferences gt gt Java gt gt Editor gt gt Save Actions 其中有
  • 如何升级 Windows 中 git svn 使用的 SVN 版本?

    我的公司正在将SVN升级到1 7 检查git svn version显示正在使用的SVN版本是1 4 6 我想获得 git svn 使用的 SVN 版本接近 1 7 但是 我没有看到有关更新 git svn 使用的 SVN 版本 在 Win
  • 致命:不是 git 存储库(或任何父目录):.git [重复]

    这个问题在这里已经有答案了 当我尝试推送 github com 上的现有存储库时 当我输入命令时 网站提示我将其输入终端 我收到了以下致命错误消息 Not a git repository or any of the parent dire
  • git Blame:合并后正确的作者

    GIT 合并引入了新的提交 这会导致 git Blame 问题 合并的行似乎是由进行合并的开发人员提交的 我可以理解这种情况冲突的变化 因为他解决了冲突 但是有没有办法让非冲突线路不发生这种情况呢 一些 git Blame 的选择 如果没有
  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 从自己的 gitlab 服务器安装节点模块

    我想从我们的 gitlab 服务器安装节点模块 这是存储库的链接 http ABCD GITLAB myGroup myNodeModule git http ABCD GITLAB myGroup myNodeModule git 根据n
  • 是否可以从本地文件系统获取TFS更改集编号?

    我有一个解决方案的本地副本 与TFS绑定 是否可以在不调用服务器的情况下从本地文件系统获取当前更改集信息 如果您可以在 assembly AssemblyFileVersion 1 0 0 RevisionNumber 您可以在那里设置更改
  • 执行 git Push 时出现“diff.renamelimit 变量”警告

    我将本地提交推送到远程 git 服务器并收到以下警告消息 remote warning only found copies from modified paths due to too many files remote warning y
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • 是否可以使用 Javascript 检索文件的最后修改日期?

    我的网页上有一组链接到 PDF 表单和 doc 表单的链接 这些文件不存储在数据库中 只是按原样存储在本地服务器上 是否可以使用 JavaScript 检索 PDF 或 DOC 文件的最后修改日期 我没有任何特定需要使用 Javascrip
  • 如何获取 git 存储库中所有文件的计数?

    如何获取 git 存储库中当前所有文件的计数 您可以使用以下命令获取 git 存储库中所有跟踪文件的计数 git ls files wc l 命令分解 The git ls files命令本身打印出存储库中所有跟踪文件的列表 每行一个 Th
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • 合并后 Git 分支和提交历史记录

    我正在开发一个项目 单独 对于我开发的每个功能 我都会创建一个新分支 处理该功能 然后将其合并到 master 中 所以通常我不会同时在两个不同的分支上工作 也不会在一个分支上工作时接触master 当我合并一个分支时 我看到 使用gitx
  • VS Code 在交互式变基期间不会等待我 [重复]

    这个问题在这里已经有答案了 如果我使用交互式变基git rebase i使用为 Git 配置的默认编辑器 一切都运行良好 如果我在我的全局中添加以下内容 gitconfig core editor C Program Files x86 M
  • Android repo 脚本创建的 .repo/projects/ 中的裸 git 存储库的用途是什么?

    The 安卓源码 http android git kernel org 由以下人员管理repo http source android com source version control html 使用 repo 同步时 一个名为 re
  • Java元数据读写

    是否可以以通用方式 对于所有图像类型 在 Java 中读取和写入元数据 我找到了一些示例 但它们总是特定的 例如 JPEG 或 PNG 我需要一些足够通用的东西 而不是到处都有 if else 语句 我不想重写源代码 但这是一个很好的例子
  • 如果您使用 CocoaPods,您的 .gitignore 中会包含什么内容?

    我从事 iOS 开发已经几个月了 刚刚了解到有前途的可可豆荚 http cocoapods org 用于依赖管理的库 我在个人项目上尝试过 添加了依赖项Kiwi https github com allending Kiwi到我的 Podf
  • 在种子项目上构建时如何组织 git 存储库

    我正在基于从 github 克隆的种子项目 MEAN io 构建一个网站 如何将这些文件与我自己的文件分开 由于该种子提供了广泛的文件框架 因此我自己的文件分布在整个项目中 我希望能够从种子中提取更新 但不能将其与我添加的文件混合 我知道我

随机推荐

  • 是否可以将 mySQL 设置为星期六作为一周的开始?

    是否可以将 mySQL 设置为星期六作为一周的开始 我正在尝试运行如下查询 SELECT DISTINCT week date FROM table WHERE date BETWEEN 2010 08 14 AND 2010 08 27
  • 排除节点 RVest

    我正在使用 RVest 抓取博客文本 并且正在努力找出一种排除特定节点的简单方法 以下拉取文本 AllandSundry test lt read html http www sundrymourning com 2017 03 03 le
  • pip install numpy pandas 失败?

    Pandas 依赖于 numpy 并且有一个开放构建问题 https github com pydata pandas issues 507安装 pandas 依赖项 无论如何 有什么想法为什么 pip 在下面的示例中退出 numpy 吗
  • 如何将新的和更新的行从离线数据库复制到在线数据库?

    这是一种情况 您有一个桌面应用程序 并且其数据库位于远程服务器中 就我而言 它是 MySQL 应用程序是用 Delphi XE3 编写的 但是 当客户想要离线和在线数据时 为了速度和安全 我们需要 使用远程服务器信息登录 更多更新 将线上数
  • 发生异常时整个 blazor Web 应用程序停止工作

    请为我提供以下问题的任何合适的解决方案 当 blazor 应用程序抛出任何异常时 整个应用程序就会崩溃并且没有链接起作用 直到我可以再次通过工作室运行该应用程序 对于这个问题该怎么办 谢谢并致以诚挚的问候 Edited 为了提供所需的信息
  • recaptcha 没有通过 selenium python 中的 anticaptcha 插件解决

    我最近开始在一个涉及自动化的项目中使用 selenium 该计划中的障碍之一是 ReCaptcha 系统 因此我决定使用反验证码作为当我的机器人遇到验证码时解决验证码的服务 我正确安装了该插件 并在他们的网站上找到了一些带有硒的测试代码 f
  • 什么是声明式编程? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 将行添加到具有动态列的 HTML 表中

    我正在使用下面的代码 作为上一个问题的解决方案提供将 mySQL 记录显示为 HTML 表列 https stackoverflow com questions 21870246 display mysql records as html
  • 如何判断 Windows 上的 Python 进程是否响应

    我正在编写一个 python 脚本来保持有错误的程序打开 我需要弄清楚该程序是否没有响应并在 Windows 上将其关闭 我不太清楚该怎么做 在 Windows 上您可以执行以下操作 import os def isresponding n
  • ggplot 中月份缩放时条形宽度不一致

    查了好久 没找到讨论类似问题的帖子 我在日期缩放方面遇到问题ggplot 我认为这与方式有关ggplot正在处理日期 我试图消除列之间的所有空白 因为我的最终结果将类似于以下内容 这是一个显示跨月项目的容量规划图表 即使使用默认的缩放和宽度
  • 用 rgl 填充球体上的区域

    这是世界各国首都的球形 Vorono 镶嵌 我有定义每个国家边界的点的坐标 我想用颜色填充这些国家 动机是用与海洋相同的颜色绘制沃罗诺伊边缘 这样我们就不会在国外看到它们 换句话说 我正在寻找类似于polygon函数 但适用于球面多边形 E
  • JSON、Jackson 和多行字符串

    我有以下 JSON content value 我让 Jackson 构建 JSON 字符串 如果该值是多行文本 例如 A B C 我看到的是 content A r nB r nC 它明确规定 r n CRLF 每行 我想知道我是否可以配
  • 单击时使用 jQuery 获取输入值[重复]

    这个问题在这里已经有答案了 我有以下内容 checkbox click function console log this ajax type POST url loadProducts data success function resp
  • iPhone SDK - 带 + 联系人按钮的 UITextField

    在某些应用程序 例如邮件 中 当您有 UITextField 时 右侧会有一个小 按钮 当您点击它时 会出现一个模式视图控制器 您可以从中选择电话号码 地址等 它将出现在文本字段中 我想知道如何在我自己的应用程序中实现这一点 谢谢 Isaa
  • Android:: 使用其他 InputFilter 以编程方式设置 EditText 的最大长度

    我像这样使用 InputFilter 只允许字母和数字 private InputFilter inputFilters new InputFilter new InputFilter Override public CharSequenc
  • 零是有效的句柄吗?

    有一个SafeHandleZeroOrMinusOneIsInvalid NET Framework 中的类 以及SafeHandleMinusOneIsInvalid class 为什么是这样 在哪些情况下零是有效句柄 作为其他答案的补充
  • 桌面 MEF 中的 ExportFactory 去了哪里?

    我找不到它 ExportFactory
  • 无法使用 SQL Native Client 从经典 ASP 连接到 SQL Server 2008 R2 (Windows 7 - IIS7)

    当我使用时 我能够连接到 SQL Server 2008 R2Provider SQLOLEDB在我的连接字符串中 但是当我使用Provider SQLNCLI在连接字符串中我无法连接 ADODB 连接错误 800a0e7a 找不到提供者
  • Qt 中同一标题栏中的最小化按钮和上下文帮助按钮

    要在 QWidget 类型的 Qt 窗口的标题栏中制作帮助按钮 我喜欢这样 myWindow gt setWindowFlags Qt WindowContextHelpButtonHint 这很好用 要在同类窗口的标题栏中制作最小化按钮
  • 如何追踪修订历史记录?

    我正在开发一个编程教程项目 我希望本教程的示例源代码具有有意义的修订历史记录 与教程的进度相关 不可避免的是 我不会在第一次就完全正确地获得所有教程提交 并且我不希望修订历史记录中充斥着我以元方式修改教程提交的提交 我认为这意味着我需要两个