在我们的一个项目中,MysQL-Dumps 与 git 同步。数据库中的每个表都有一个文件。拉取/合并后,转储将通过钩子导入到本地数据库。现在的问题是,我需要找到所有通过拉取更改的表转储,以便仅导入这些转储。我如何让合并后钩子知道哪些文件发生了更改?在合并之前可能不止一个提交,通常还有更多提交。
我如何获得已修改文件的列表?
答案1
git diff --name-only SHA1 SHA2
用于git log
获取 git 提交 ID。git diff SHAx
如果您只想与已提取的最新头部进行比较,请使用 just。
在你git pull
执行git log
或git status
获取 SHAx 之前。你可以git fetch
执行合并之前的操作,而不是拉取,而是进行日志和差异操作。
答案2
我发现的最简单的方法是
git diff --name-only HEAD@{0} HEAD@{1}
因为HEAD@{n}
表示第 n 个前值HEAD
答案3
我使用git reflog
后得到了git pull
如下结果:
SHA1 HEAD@{0}: pull: Fast-forward
SHA2 HEAD@{1}: checkout: moving from somewhere to anotherplace
在读出“拉:快进”之后的 SHA 就是拉动之前所在的 SHA。
之后,我使用了git diff --name-only SHA2
另一个答案,它将为您提供从该提交到当前状态更改的文件列表。
我不能 100% 确定这对于具有大量更改和合并的拉动如何起作用,但对于简单的快进来说,它工作得非常好。
答案4
在您拉取/合并分支之后,您可以立即看到拉取或合并的更改(即由新的提交/合并引入的更改):
git diff ORIG_HEAD HEAD
否则大多数合并将有两个父级,HEAD^1
和HEAD^2
。如果所有更改的表都作为单个提交提交,那么很可能其中一个是主/源分支,另一个是钩子的提交 - 您需要做的就是仅显示该侧的更改,例如:
git diff --name-only HEAD^2
对于更复杂/交叉的合并,解开变化实际上可能相当困难。Git log 有高级选项来选择最理想的路径,这取决于变更流程,YMMV。