Stop Using (only) GitHub Releasesa day agohttps://hugotunius.se/2024/01/20/stop-using-github-releases.html作者意外升级了Rust依赖项,但因项目缺少CHANGELOG.md文件而面临困难,仅依赖GitHub发布说明。GitHub发布存在缺陷:分页导致交叉引用困难,它们不属于仓库本身,且若GitHub衰落则可能丢失。仓库中的CHANGELOG.md文件会随代码迁移,应作为发布说明的主要来源。该原则不仅限于变更日志:提交信息应解释变更原因,文档应存储在markdown文件中,任何能以文件形式表达的项目相关数据都应作为文件保存在仓库中。
Git cheatsa day agohttps://jyn.dev/git-cheats/Git 拥有优秀的数据模型,但用户界面不太友好。如果你丢失了一个提交,运行 `git reflog` 查找最近的提交。变基后,使用 `git push --force-with-lease` 而不是常规的 `git push` 以避免被拒绝。如果在 `git pull` 后不小心合并了,使用 `git reset --hard HEAD~` 撤销合并提交。分离头指针意味着你不在任何分支上;用 `git checkout --branch <name>` 创建新分支保存工作。要覆盖未跟踪的文件,先提交更改,或使用 `git submodule deinit`,或小心删除文件。在 rust-lang/rust 中,通过 `./x.py --help` 更新子模块来修改 Cargo.lock。用 `git commit --amend` 修改最后一次提交;用 `git commit --fixup` 和 `git rebase --autosquash` 修复更早的提交。通过变基到默认分支 `git rebase -i origin/HEAD` 删除合并提交。Git 的错误信息往往无助于解决问题;更好的信息应能引导用户找到正确解决方案。
pre-commit hooks are fundamentally brokena day agohttps://jyn.dev/pre-commit-hooks-are-fundamentally-broken/
I taught a bucket to speak git | Tigris Object Storagea day agohttps://www.tigrisdata.com/blog/objgit/作者使用billy——一个最初为go-git设计的抽象层——教会了一个“桶”像文件系统一样工作,从而在对象存储上实现Git操作。Git仓库由对象、树、提交和引用组成;对象是内容寻址且只追加的,非常适合Tigris对象存储。将Git仓库存储在单机上会产生有状态服务和潜在故障;GitHub的规模迫使依赖挂载的文件系统。替代方案如调用git二进制、libgit2或libgit2都有局限(例如进程终止、GPL问题或本地文件系统假设)。go-git是一个纯Go库,不依赖本地文件系统,使得objgit能通过billy接口与Tigris配合。Objgit成功支持通过HTTP、git://和SSH的推送/拉取,仓库在首次推送时创建,并包含优化指标。关键挑战包括:对象存储缺乏原子重命名(通过Tigris的RenameObject解决)、包文件缓冲以及推送过程中过多的stat()调用。通过本地缓存不可变包文件以及修复递归列表缓存以减少ListObjectsV2调用,解决了性能问题。Post-receive钩子在沙盒环境(kefka)中运行,访问受限,能实现类似CI的操作而不依赖网络或主机文件系统。未来计划包括CI集成、Web界面和性能改进,强调在对象存储上实现无状态Git服务器。
Staging patches with Git add -p3 days agohttps://www.simonholywell.com/post/git-add-p/`git add -p` 允许交互式暂存文件更改,便于在提交过程中审查和发现错误。它可以将更改拆分为代码块进行选择性暂存,有助于将相关修改组织到不同的提交中。该功能提供 'y'(暂存)、'n'(跳过)、's'(拆分)和 'q'(退出)等多种选项,实现精细控制。它不适用于新文件(无法提供差异对比),但在大多数其他场景中非常有用,包括部分文件的提交。使用 `git add -p` 可在暂存阶段进行代码审查,从而改善提交的组织性并减少错误。
git's –end-of-options Flag7 days agohttps://nesbitt.io/2026/07/21/end-of-options.htmlGit 的 --end-of-options 标志于 2019 年引入,用于标记修订版参数解析的结束,与用于分隔修订版和路径规范的 -- 不同。参数注入(CWE-88)发生在将带有破折号开头的不安全字符串作为参数传递给 git、hg 或 ssh 时,即使没有涉及 shell 也会发生。在 17 个 fork git 的包管理器中,只有一个使用 --end-of-options;其他依赖 -- 或破折号检查,这些检查通常作为漏洞修复添加。--end-of-options 的最低 git 版本要求因子命令而异,支持范围从 2.24.0 到 2.43.1,这使得旧版本发行版的采用变得具有挑战性。像 libgit2 这样的 Git 库通过不使用 argv 接口来避免参数注入,但必须跟踪上游 git 的所有结账安全补丁。
Git rebase -I is not that scary14 days agohttps://cachebag.sh/journal/interactive-rebasing/作者对开发者中普遍存在的对git rebase -i的恐惧表示惊讶,即使是经验更丰富的开发者也是如此,并旨在揭开其神秘面纱。运行git rebase -i HEAD~4会打开一个文本文件,其中列出了最近的提交和命令(pick、reword、squash、fixup、drop),这是一个变更计划,而不是立即执行的操作;用户可以使用git rebase --abort中止操作。交互式变基涉及为每个提交编辑指令(例如,重新编写提交消息或删除提交),创建新的提交,同时旧的提交在git的对象数据库中保持完整,直到垃圾回收。安全措施包括:使用git rebase --abort中止变基,使用引用日志恢复之前的状态(例如,git reset --hard HEAD@{4}),以及创建备份分支(git branch backup-before-rebase)。在变基过程中可能会出现冲突,但可以一次解决一个提交(类似于合并冲突),使用git add和git rebase --continue,这使得它比分支合并更容易。作者建议在个人功能分支上自由使用变基,并使用git push --force-with-lease推送(出于安全考虑,优于--force),同时强调理解和谨慎。关键要点是开发者应该学习并使用交互式变基来保持分支历史的整洁,文章鼓励初学者尝试使用并克服恐惧。
The Git history command deserves more attention15 days agohttps://lalitm.com/post/git-history/Git history 是 Git 中的一个新实验性功能,引入了三个子命令:fixup、reword 和 split。fixup 允许暂存更改并将它们折叠到一个旧提交中,然后自动重新定位所有包含该提交的分支。reword 更新旧提交的提交消息,并自动重新构建所有后续提交,而不触及工作树。split 通过交互式选择代码块,将单个提交分成两个,并在其基础上重新构建提交堆栈。所有三个命令都是原子性的,通过拒绝可能导致冲突的操作来避免将树留在半损坏状态。与 jj 不同,git history 尚未将冲突处理作为一等公民,但文档表明未来可能会改变。git history 提供了 jj 的许多优点,而无需完全切换工作流,并且它是核心 Git 发行版的一部分。
Why don't people use Git properly?24 days agohttps://deadsimpletech.com/blog/why-dont-people-use-git-properly作者介绍了Arca,这是一个带有落地页的教育项目,即将开放早期访问,并为捐赠者提供免费名额。Git是一种关键的版本控制系统,在软件开发中广泛使用,但许多人使用起来很吃力,导致合并冲突、提交不规范和仓库滥用等问题。问题的根源在于对Git的教育和实践经验不足,尤其是那些不处于核心软件岗位、缺乏机构支持或学习动力的人群。一个主要障碍是Git依赖命令行界面,许多开发者(特别是Windows用户或不熟悉命令行的IDE使用者)觉得不直观且难以掌握。人们往往不理解Git能解决的问题(如快速回滚、部署自动化和开发中的风险承担),因为他们缺乏需要这些功能的项目的实际经验。作者将Git比作罗马盔甲,解释说它提供的安全感让开发者能够承担更大风险、更有雄心,但若未体验过这种保护,用户可能养成防御性习惯并回避新工具。为了改进Git使用,作者建议在教育早期引入版本控制,并推动企业实行DevOps轮岗,但也承认这些方案在规模化推广上面临挑战。
Magit 4.6 Released25 days agohttps://emacsair.me/2026/07/01/magit-4.6/Magit 版本 4.6 发布,自上个版本以来共有 313 次提交。Magit 是一个基于文本的 Git 用户界面,通过助记键序列简化工作流程。改进主要集中在 blob-visiting 缓冲区,提升了性能和用户体验。易失性的 blob 缓冲区被缓存以供重用,支持如语法高亮等功能。现在可以仅使用 blob 对象 ID 来访问 blob,无需修订版本和路径。增加了 diff 的语法高亮功能,但由于同步处理延迟,默认情况下是禁用的。计划未来支持异步 diff 语法高亮。引入了新的 Git 变量,用于从 Git 钩子调用 Elisp 钩子,需要 Git v2.54.0 或更高版本。添加了用于编译 diff 中修改的定义列表并将其插入提交消息的命令。提交消息中的符号补全现在包括修改的定义和变更行中的符号。