在提交的代码中检测 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.txt
和 merge-file.txt
)。
所以,这就是稳健的方法,没什么可补充的。
要求
- 在提交和推送代码后的管道内,我希望检测合并冲突
有没有办法检测提交和推送的代码中的冲突标记?如果在提交的代码中发现任何冲突标记,我想要一个带有合并请求的 运行 管道失败。
</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.txt
和 merge-file.txt
)。
所以,这就是稳健的方法,没什么可补充的。