如何追踪修订历史记录?

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(使用前将#替换为@)

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

  • 从 Eclipse 的历史视图中删除 ORIG_HEAD 和 FETCH_HEAD

    我最近开始使用 Eclipse Kepler 和 EGit 插件 这些分支不是我习惯的 有没有办法永久阻止这些分支的创建 我尝试手动删除它们 但它不起作用 并且我不想在下次获取或变基时保留它们 据我从对您问题的评论中了解到 您只希望这些参考
  • git update-index --no-assume-unchanged 不起作用

    我设置了assume unchanged咬了几个文件 现在我想取消它们 但这不起作用 gt git update index no assume unchanged Gemfile gt git ls files v grep Gemfil
  • 每个分支的 Git 磁盘使用情况

    你知道是否有办法列出每个分支的 git 存储库的空间使用情况 喜欢df or du would 分支的 空间使用情况 是指 尚未在存储库的其他分支之间共享的提交所使用的空间 这没有正确的答案 如果您查看仅包含在特定分支中的提交 您将获得 b
  • Git 与人工制品

    刚刚完成 NPM 和 Bower 的 Artifactory 设置 它非常容易使用 您只需更改存储库 URL 一切就正常了 查看有关如何让 Artifactory 与 github vcs 一起使用的文档 它看起来过于复杂 我想知道是否有人
  • Azure git 部署 - 第二个程序集中缺少引用

    我正在尝试将 Bitbucket 部署设置到 Azure 网站 我成功链接了 Bitbucket 和 Azure 但是当我推送到 Bitbucket 时 我在 Azure 站点上收到以下错误 如果我单击 查看日志 它会显示以下编译错误 D
  • 警告:引用名称“xxx”不明确

    我想知道为什么我收到 refname is ambigeous 的警告 这是否意味着名称以该字符串开头的分支不超过两个 但这里没有 Thanks git checkout B03799 warning refname B03799 is a
  • Git 分支之间未跟踪的文件

    我一直在这里寻找答案 看来我可能只是对 git 分支应该如何工作做出了错误的假设 我有我的master分支 我创建了一个名为的功能分支profiles我正在对个人资料进行一些特定的工作 在处理配置文件时 我更改了 5 或 6 个文件 并添加
  • 更改 Windows 安装的 Git Bash 中 ~ 目录的位置

    我什至不确定我问的是正确的问题 让我解释一下我的情况 这是关于 Windows 7 上的 Git 我的公司在网络驱动器上设置 Windows 用户目录 而不是在本地硬盘驱动器上 用于备份和超出本问题范围的其他目的 我无法改变这项政策 然而
  • 如何更改全局 git 设置以在拉取期间进行 git 合并

    目前 我的全局设置设置为在 git pull 期间执行变基操作 我希望它默认将其更改为 git merge 如何更改此设置 TL DR git config global pull rebase false 有点细节 Git 使用配置pul
  • 如何克隆没有提交的裸 git 存储库并在克隆过程中获取正确的 HEAD 引用?

    这个答案 https stackoverflow com a 26898059 438273声称该问题已在版本中修复1 8 4 3 但是我在版本中还是遇到了2 25 1 它似乎在版本中按预期工作2 32 0 所以我不确定它是什么时候真正修复
  • 无法在 git 上获取 Http 工作

    我在拇指驱动器上使用 gitbash 作为 git 我的防火墙阻止了我 并且想设置我的 git 以进行 http 访问 我使用 github 并且已经看到了有关如何执行此操作的各种信息 但我还不够了解 无法让它为我自己工作 我在 php i
  • 在防火墙后面使用 GitHub,无需 SSH 访问

    我真的很想使用 GitHub 但我的公司一切都被锁定了 现在 我只能通过HTTP协议使用Tortoise SVN 我可以以同样的方式使用 GitHub 吗 如果是这样 怎么办 我认为你一直能够克隆github https github co
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • 将存储库从 Github 移至 Gitlab

    有没有办法将整个存储库从 Github 移动到 GitLab 对于代码本身来说 只需在 GitLab 上创建一个新的存储库并推送到它即可 Wiki 页面位于 Github 上的单独分支中 并通过 Git 机制进行管理 据我所知 GitLab
  • 未找到 Gradle DSL 方法:“versionCode()”

    构建我的 Android 项目时遇到问题 我使用Grgit https github com ajoberstar grgit填写versionCode and versionName在 gradle 中 一切工作正常 直到我将 Andro
  • 是否有 git-merge --dry-run 选项?

    我正在合并一个可能有很多冲突的远程分支 我怎么知道它是否会发生冲突 我没有看到任何类似的东西 dry run on git merge 如前所述 传入 no commit标志 但为了避免快进提交 也传入 no ff 像这样 git merg
  • 防止在 Git 中签出

    我目前正在研究使用 Git 管理 OpenInsight 应用程序的源代码 由于 OI 代码存储在数据库表中 因此需要进行一定量的手动工作才能将源代码导出为文本 反之亦然 到目前为止 我已经成功地使用 Git 挂钩自动化了很多这项工作 但是
  • 本地分支显示在 GitHub 的“网络”视图上

    我们使用 Git 我们的工作流程由 dev 和 master 分支组成 它们位于 GitHub 和每个开发人员的本地存储库上 不会直接在 master 或 dev 上执行任何工作 而是在本地分支中执行工作 并且仅在 dev 上进行合并 然后
  • 如何将 tfvc 迁移到 Git(包括历史记录)

    我们计划从 tfvc 迁移到 Git 版本控制 我们有一些 GB 的代码和数千个变更集 我阅读了一些文章并浏览了 Microsoft 文档 发现了 2 个选项 提示迁移 我可以在其中使用 Azure Devops 内置工具 导入存储库 它有
  • Visual Studio 2017/2019/2022 gitsync/pull/push/fetch 操作卡住,并且无法停止

    我从 Visual Studio 中的 Git Changes 选项卡启动同步 获取 拉取或推送 但操作只是挂起 没有选项可以停止它 我必须点击 X 才能关闭 Visual Studio 如果操作是同步的 它会在其他所有操作上打开一个模式对

随机推荐

  • 是否可以将 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 这很好用 要在同类窗口的标题栏中制作最小化按钮
  • 如何追踪修订历史记录?

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