如何在Git中编程生成修改并仅暂存该修改,效果等同于使用-p参数?
解决方案
核心思路是利用git底层命令直接修改暂存区的目标文件blob,仅更新__REV__对应的行,不会触碰文件内其他已暂存的修改,也不需要执行git add全量添加文件。
完整修改后的pre-commit钩子代码如下:
#!/bin/sh set -e f="targetFile.js" # 1. 处理暂存区版本:更新暂存区里的修订号,不影响其他暂存内容 # 从暂存区导出目标文件内容,计算新的修订号 new_v=$(git show :"$f" | awk -F'[ \t;]' '/^const __REV__ = /{print $4 + 1}') # 生成修改后的暂存区版本内容,写入git对象库后更新暂存区索引 git show :"$f" \ | sed -e 's:^const __REV__ = [0-9]\{1,\};$:const __REV__ = '$new_v';:' \ | git hash-object -w --stdin \ | xargs -I {} git update-index --cacheinfo 100644 {} "$f" # 2. 处理工作区版本:更新本地文件,保证工作区和暂存区修订号同步 # Linux环境下请把下行的 `-i ''` 改成 `-i` sed -i '' -e 's:^const __REV__ = [0-9]\{1,\};$:const __REV__ = '$new_v';:' "$f" echo New rev: $new_v
逻辑说明
- 全程不需要执行
git add命令,通过git底层命令直接操作暂存区索引,仅修改const __REV__ =对应的行,完全不会影响文件内其他已经暂存的修改,也不会把工作区未暂存的其他改动带到暂存区。 - 完全符合你给出的约束条件,不需要考虑该行冲突或多匹配问题。
内容的提问来源于stack exchange,提问作者fferri
相关产品推荐
相关产品推荐

