在提交的代码中检测 git 个冲突标记

detect git conflict markers in committed code

要求

有没有办法检测提交和推送的代码中的冲突标记?如果在提交的代码中发现任何冲突标记,我想要一个带有合并请求的 运行 管道失败。

</div>
<<<<<<< HEAD
=======

>>>>>>> next
<div

注意:我不是在寻找有用的解决方法。源代码不是100%在我的控制之下。

但是,如果文件在不同的行上有 <<<<<<< ======= >>>>>>>,那么欢迎使用任何可靠的 grepping 替代方法。我好像记得冲突标记的格式可以和上面的不一样。

技术:Azure DevOps & Github yaml 管道

解决方案:

PowerShell/pwsh(TODO:检查语法,进行中)

$cd=Get-Location
$files = Get-ChildItem $cd
foreach ($f in $files) {
  $mergeConflictCounters = New-Object Collections.Generic.List[Int]
  foreach($line in [System.IO.File]::ReadLines($f.FullName)) {
    if ($line -like '*<<<<<<<*') {
      $mergeConflictCounters.Add(0)
    } else if ($mergeConflictCounters.Count -gt 0 -and $mergeConflictCounter -like '*=======*') {
      $mergeConflictCounters[$mergeConflictCounters.Count - 1] = $mergeConflictCounters[$mergeConflictCounters.Count - 1] + 1
    } else if ($mergeConflictCounters.Count -gt 0 -and $mergeConflictCounter -like '*>>>>>>>*') {
      $mergeConflictCounters[$mergeConflictCounters.Count - 1] = $mergeConflictCounters[$mergeConflictCounters.Count - 1] - 1
      if ($mergeConflictCounters[$mergeConflictCounters.Count - 1] -eq 0) {
      $mergeConflictCounters.RemoveAt($mergeConflictCounters.Count - 1)
      }
      if ($mergeConflictCounters.length -eq 0) {
        exit(1) // Merge conflict marker successfully aligned
      }
    }    
  }
}

TODO:deno 的解决方案/node.js。可能还有另一个脚本来选择传入或现有 - 只要将其视为 prototype/experiment

我的第一个想法是编写一个钩子,用于 grep 查找您要查找的行。如果您将此作为 pre-commit 挂钩执行,那么您只需要 grep 差异,而不是整个项目。您可以完全阻止添加它们。

But any robust alternative to grepping if a file has <<<<<<< ======= >>>>>>> on separate lines would be welcome. I seem to remember conflict markers can have a different format then just above.

这正是冲突标记的形状。它是这样记录的(Documentation/git-merge.txtmerge-file.txt)。

所以,这就是稳健的方法,没什么可补充的。