在 KRL(库卡机器人语言)项目中使用 git

Using git with KRL (KUKA Robot Language) projects

我在 KRL 项目中使用 git 时遇到一些问题,想知道是否有一些解决方法可以改进我的工作流程。

KRL 是工业 KUKA 机器人的编程语言。它有一个 Basic-/Pascal-like 语法。一个程序由一个或多个模块组成。一个模块由两个文本文件组成,一个用于源代码 (.src),一个用于声明和定义 (.dat).

我的第一个问题是,在每个文件中,第一行构建 header,如下所示:

&ACCESS RVO
&REL 175

每个 header 行都以 & 开头,对代码完全没有意义。最糟糕的是 header 不断变化。因此,当我将文件从机器人控制器复制回我的存储库时,git 指出文件已更改,即使源代码相同。

所以我的第一个问题:有没有办法使用过滤器或挂钩来忽略所有以 & 开头的行?

我的第二个问题是 *.dat 文件不仅像 C-like 语言中的 header 文件那样用于声明和定义,而且还用于存储值。这看起来像这样:

DECL E6POS XP1={X 319.710815,Y -488.601227,Z 1364.72363,A -73.5368805,B 88.6439896,C 10.5155058,S 6,T 26,E1 0.0,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0}
INT counter=123
REAL offset=0.123

我依赖这些值,因为它们存储需要保持持久性的位置和计数器,但我不关心我的回购中的它们。好吧,不完全是,它们必须在文件和我的回购协议中,但 git 不应该在这些行中查找差异。

假设我在我的存储库中创建了一个模块并将该模块复制到机器人。现在我用机器人执行这个模块并且必须覆盖一个位置值。这会更改相应 *.dat 文件中的值。一切正常,几天后我想实现一个计数器。我不能只将新的整数定义放入本地可用的 *.dat 文件中,因为这样我会覆盖机器人上的位置值。所以我必须先将机器人控制器中的 *.dat 文件复制到我的存储库中,然后在那里定义新变量。但是当然 git 向我展示了文件不仅在新行中发生了变化,而且在机器人更改值(如位置)的行中也发生了变化。这使得评论变得更加困难,因为我有很多不断变化的测量值和计数器值。

关于我的第二个问题:有没有办法忽略 = 之后的所有内容,但仅限于 *.dat 文件?这应该与 header 中的 & 一样工作,所以这些值应该在 repo 中,但我不关心这些值的任何差异。

欢迎 ascaron37!

对于你的第一个问题, 以“&”为前缀的 header 值是 KSS 的 auto-generated,这是一种无法停用或修改的行为。 header 对代码执行没有影响,所以可以随时删除;但是,KSS 会在某个时候再次 auto-generate 它们。

我的解决方案是在 C# WPF 中创建一个“KRL-Git 清洁器”工具,该工具从 Workvisual 存储库文件夹中的任何文件中清除任何 auto-generated 行,通常位于“C:\Users”中"用户名"\Documents\WorkVisual 6.0\Repositories".

我的工作流程是这样的:

  1. 在机器人或 WorkVisual 上编写代码
  2. 运行 我的 KRL-Git 清洁器从存储库中删除任何 auto-generated 行
  3. 进行 git 提交

由于公司政策,我无法分享该项目,但我可以提供一个片段,其中包含我如何擦除线条的示例:

        using System;
        using System.IO;
        using System.Windows;
        using System.Windows.Input;

        /// <summary>
        /// Delete deletable lines withing directory and children
        /// </summary>
        /// <param name="parentDirectory"></param>
        /// <returns></returns>
        private int DeleteAllChildren(DirectoryInfo parentDirectory)
        {

            int deletables = 0;

            foreach (var childDirectory in parentDirectory.GetDirectories())
            {
                deletables += DeleteAllChildren(childDirectory);
            }

            foreach (var childFile in parentDirectory.GetFiles())
            {
                if (childFile.Extension == ".src" || childFile.Extension == ".dat" || childFile.Extension == ".sub")
                {
                    var tempFile = Path.GetTempFileName();
                    using (StreamWriter sw = new StreamWriter(tempFile))
                    {
                        using (StreamReader sr = new StreamReader(childFile.FullName))
                        {
                            var inLine = "";
                            while (!sr.EndOfStream && !inLine.Contains("DEF"))
                            {
                                inLine = sr.ReadLine();

                                if (!inLine.Contains("&REL") && !inLine.Contains("&ACCESS"))
                                {
                                    sw.WriteLine(inLine);
                                }
                                else
                                {
                                    deletables += 1;
                                }

                            }
                            while (!sr.EndOfStream)
                            {
                                sw.WriteLine(sr.ReadLine());
                            }

                            sr.Close();
                        }
                        sw.Close();
                    }

                    File.Delete(childFile.FullName);
                    File.Move(tempFile, childFile.FullName);
                }
            }

            return deletables;
        }

如果您正在寻找更简单的方法,我很抱歉,但 KUKA 似乎不太关心行业标准版本控制。

至于你的第二个问题,我的策略是在我上面的代码片段中使用功能,因为我已经用它来摆脱 auto-generated 行。不过,我敢打赌一些 Git 专业人士会有更优雅的解决方案。

使用过滤器可以忽略这些行。

假设我们在 /scripts/krl_filter.sh:

上有一个过滤器
sed -e '/\&ACCESS/d' -e '/\&REL/d' -e '/\&PARAM/d' -e '/\&COMMENT/d'

我们把过滤器设置成/.git/config

[filter "krl"]
  clean = $PWD/scripts/krl_filter.sh
  smudge = cat
  required = true

我们将其应用于 KRL-files .git属性

*.src filter=krl
*.dat filter=krl
*.sub filter=krl

也许您会在提交标题行之前看到已更改,但一旦更改或以其他方式上演,就会应用过滤器

*对于 .dat 文件,您可以使用这样的过滤器:

sed -e 's/=[^=]*$/=/'

有关忽略 git 中的行的更多信息,请查看: How to tell git to ignore individual lines, i.e. gitignore for specific lines of code

不完全正确,Header 中 & 后面的值完全不相关。 至少 &ACCESS 参数后面的 'V' 标志是有用的,请声明这些模块和这些 module-functions 的调用在 SmartPad/SmartHmi 处可见或不可见。其他值(除了COMMENT,什么是self-explanatory)不经常使用,由KRC正确添加。

因此我向 ~/.git/config 添加了一个过滤器,它只删除 &ACCESS 行中的数字,以及其他一些 header-params.

[filter "krl"]
    clean = "sed -e 's/\(^&ACCESS [A-Z]*\).*$//' -e '/\^&REL/d' -e '/\^&PARAM/d'"
    smudge = "sed -e 's/\(^&ACCESS [A-Z]*\).*$//' -e '/\^&REL/d' -e '/\^&PARAM/d'"

您还必须将这些过滤器应用于 .git 属性

中的文件
*.src filter=krl
*.dat filter=krl
*.sub filter=krl

.dat 文件中的数据是一个更大的问题。但是,如果您不需要持久性(您可能不需要,否则您可能想将其添加到版本控制中),您可以在没有赋值的情况下在 .dat 文件中声明变量。喜欢:

DECL INT foo
DECL E6POS bar

在这些情况下,您需要在读取之前分配一些值,否则会出错。

或者您将一些 sed commad 添加到您的 git 过滤器中,例如

`sed -e 's/\(^ *DECL  *[A-Z]*  *[A-Za-z][A-Za-z0-9]* *=\).*\(;\ignoreVersion\[\(.*\)\]\)/  /'

有了这些,您可以在作业后面添加评论,例如

DECL INT foo = 1234 ;ignoreVersion[12]

在这些情况下,foo 的值将在每次提交时替换为“12”。