使用Git管理VB6代码

28

我们公司的VB6代码库很大,目前使用VSS,虽然我们讨厌它,但至少可以集成到VB6 IDE中。

我的团队正在研究替代SCMs,比如我个人喜欢的Git。使用Git Extensions,看起来我们将能够很好地将Git命令集成到Visual Studio IDE中。

然而,问题已经被提出:Git是否也适用于我们的VB6代码库?

当然,我认为文件本身在git存储库中应该能够正常工作,但是毫无疑问,如果开发人员不得不使用命令行来进行所有源代码控制,他们肯定会抱怨。但有没有人使用过VB6和Git?VB6 IDE内是否提供任何集成?或者没有IDE集成也并不那么麻烦吗?

我能因为第一个创建 [vb6] 和 [git] 的荒谬标签组合而获得徽章吗?


1
个人而言,我不太喜欢 IDE 集成,除了报告状态(绿灯等)之外。在 IDE 中,我从未找到一个我个人更喜欢的替代品,它们通常都是第三方程序、Shell 集成或者我最喜欢的命令行。对于创建 VB6 和 Git 标签,你肯定应该获得徽章 :) - krystan honour
12
VB6和Git出现在同一个句子中?是的,绝对值得称赞。 - hasen
9个回答

25
我发现这个解决方案在我们的情况下非常有效。它比之前的答案更加详细,并且解决了我们在使用git时遇到的众多问题。 .gitattributes
# Set the default behavior, in case people don't have core.autocrlf set.
* text eol=auto
*.bas text eol=crlf
*.frm text eol=crlf
*.log text eol=crlf
*.vbp text eol=crlf
*.cls text eol=crlf
*.vbw text eol=crlf
*.dsr text eol=crlf
*.ini text eol=crlf
*.res binary
*.RES binary
*.frx binary
*.exe binary
*.dll binary
*.ico binary
*.gif binary
*.ocx binary
*.tlb binary
*.ocx.bin binary
*.ism binary
*.bin binary
*.aps binary
*.ncb binary
*.exe.compat binary
*.ocx.compat binary

.gitignore

.DS_Store
.Trashes
*.vbw
*.csi
*.exp
*.lib
*.lvw
*.dca
*.scc
*.tmp
<name of built binary, exe, dll or ocx>

谢谢你的回答,真的很有帮助。你还应该添加以下内容:*.vbg文本eol=crlf,*.ctl文本eol=crlf,*.pag文本eol=crlf到.gitattributes中,以涵盖项目组、自定义控件和属性页。 - lschmid

10

我已经使用Git来管理VB6项目大约一年了。从未遇到过任何IDE集成的问题。个人喜欢使用命令行,所以我没有太多地寻找。我遇到的两个主要问题是:

  1. VB6 IDE不会监视项目文件,如果其中任何一个文件在外部发生更改(例如使用“git reset”,“git checkout”),则需要重新打开项目以反映更改。
  2. VB6 IDE有时会在加载项目时更改事件参数或变量的大小写,因此除非您想在代码更改中添加大量垃圾,否则永远不要使用“git commit --all”。

9

你需要创建文件.gitattributes以使用Windows换行符(crlf),因为Git最初是在Unix系统上开发的。

# Declare files that will always have CRLF line endings on checkout.
*.vbp text eol=crlf
*.frm text eol=crlf
*.cls text eol=crlf
*.bas text eol=crlf
*.dsr text eol=crlf
*.ini text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.frx binary
*.exe binary
*.dll binary
*.ocx binary

还需创建.gitignore文件,其内容应包含以下行:

## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.

# User-specific files
*.vbw
*.tmp
*.scc
*.dca

*.dca 是什么类型的临时文件? - Uke
2
“.dca”文件是Data Dynamics Active Reports的临时文件。 - togobites

8
这篇文章是针对KeithTheBiped等人的其他优秀评论的补充。但是,在VB6中,我们可以通过一些方式使立即窗口“像”现代终端窗口,并捕获输出结果并使用Debug.Print将其传递回立即窗口,类似于终端窗口,但当然没有任何交互元素。
这对大多数命令有效,但无法捕获"git push"阶段的某些输出。为了方便(在我看来),这是一个可以接受的折衷,因为它不需要使用shell。
我们可以使用命令提示符(cmd.exe /c),使用1>和2>管道定向到临时文件来实现。如果您还没有提供一些基本函数,则我会提供相应的源代码。
请考虑以下功能:
Public Function RunCmdToOutput(ByVal cmd As String, Optional ByRef ErrStr As String = "") As String
Const p_enSW_HIDE = 0

On Error GoTo RunError

  Dim A As String, B As String
  A = TempFile
  B = TempFile

  ShellAndWait "cmd /c " & cmd & " 1> " & A & " 2> " & B, p_enSW_HIDE

  RunCmdToOutput = ReadEntireFileAndDelete(A)
  ErrStr = ReadEntireFileAndDelete(B)

  Exit Function

RunError:
  RunCmdToOutput = ""
  ErrStr = "ShellOut.RunCmdToOutput: Command Execution Error - [" & Err.Number & "] " & Err.Description
End Function

你需要:
  • TempFile - 返回一个独特且不存在的文件名,你的程序需要对其具有读写访问权限。最好使用GetShortPathName API来缩短长路径名。
  • ShellAndWait - 标准的“启动进程并等待其退出”的方法。
  • ReadEntireFileAndDelete - 获取文件内容,然后删除该文件,返回字符串。

一旦你完成了这些,并可以成功运行任何简单执行并将其输出到即时窗口,就像这样:

?runcmdtooutput("ver")
Microsoft Windows [Version 10.0.16299.309]

从这里开始,您可以运行Git,并将大多数内容显示到即时窗口中,就像这样简单使用,但我们可以做得更好。

假设您已经安装了命令行Git并更新了路径以使其可用,您可以创建一些新的函数(希望在模块中):

Private Function GitCmd(ByVal C As String, Optional ByVal NoOutput As Boolean = False) As String
  Dim ErrSt As String
  GitCmd = RunCmdToOutput(C, ErrSt)
  If Not NoOutput Then Debug.Print GitCmd ' Because it also returns the string
  If ErrSt <> "" Then Debug.Print "ERR: " & ErrSt
End Function

Public Function Git(ByVal C As String) As Boolean
  GitCmd "git " & C
  Git = True
End Function

从这里开始,您几乎可以在立即窗口中运行Git命令。记住,Git()是一个函数,因此您必须将参数作为字符串传递...仅需一个必要的字符。当然,VB会自动完成字符串,因此您不需要尾随引号,但我会包括它。使用以下语法:

Git "status"
Git "add ."
Git "commit -m ""Some Git Commit"""
Git "pull -r"
Git "push"

它不允许交互式git命令(git add -p),但是,你可以使用暴力方法(git add . -f)来完成。但是,这些命令会直接在“立即窗口”中运行并显示其输出,无需其他努力。

git "status"
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
...

你有了想法。
从那里开始,你也可以自动化一些事情。创建帮助函数来批处理常用的Git命令等,或者只是消除一些笨拙的语法。通过使用RunCmdToOutput,您还可以重新编写其中的一些内容以使用MsgBox,如果需要的话,但我认为即时窗口已经足够直观了。
在某些时候,将任何函数限制为仅在IDE中运行可能也很重要,但这是可选的。
Public Function IsIDE() As Boolean
  On Error GoTo IDEInUse
  Debug.Print 1 \ 0 'division by zero error - Debug is ignored by compile
  IsIDE = False
  Exit Function
IDEInUse:
  IsIDE = True
End Function

Public Function GitStatus()
  If Not IsIDE Then Exit Function
  GitCmd "git status"
  GitStatus = True
End Function

顺便提一下,虽然我使用了上述的变体,但它确实需要类似于RestartIDE()这样的函数,每当我执行git pull -r时,我也会使用它。它会对IDE进行新的启动,并在当前进程上执行API KillProcess()...有点野蛮,毫无疑问...请确保您先保存任何更改...但是,由于VB6不会重新加载在IDE外部更改的文件,而像VB Accelerator这样的插件在从Immediate Window启动时无法检测到Git所做的更改,因此似乎需要一些粗暴的处理来检测文件更改。 - User51

5
你最了解你的开发人员。他们介意使用命令行吗?他们喜欢IDE集成吗?这些都是个人偏好。
确保最受尊重的开发人员理解git的好处并支持这个决定。
请注意,一些VB6源文件是二进制的,不应该被合并,例如.frx文件。我不懂git,所以不知道这是否会成为问题。

3

我们正在做这件事。我们已经将以下内容添加到.gitIgnore文件中

  • *.csi
  • *.exp
  • *.lib
  • *.lvw
  • *.vbw
  • MyProject.dll

3

VB6的代码基础(即文本文件)有什么不同之处,使其不适合于git?

文化是另一回事:如果你有很多无能的开发人员处理不了命令行,解决方案可能包括尽可能远离VB6。

唯一可能的问题是,在git世界中,Windows算是二等公民。如果你发现git在你的环境中工作得不太好,你可以尝试使用bazaar或mercurial。


如果您在 Windows 上使用 msysgit,则不应该有成为二等公民的问题。我使用它连接到 TFS(通过 SVNBridge,然后是 git-svn),并且在使用中没有遇到任何问题(除了 SVNBridge 的速度)。历史上可能是这样,但现在已经不是那么重要了。 - Leom Burke
1
VB6 真的就是个混蛋。 - hasen
其他语言都太原始了,基于20世纪50年代的编程技术。 - Bob77

2

我使用 Atlassian SourceTree 管理我的 VB6 项目在 git 存储库中。运行良好。

如上所述,一个障碍是当在 IDE 中定义标识符时,IDE 会更改匹配标识符的大小写,并且这些更改产生大量的所有都是虚假的更改。

解决方案是将一块标识符放入文本文件中,并根据需要将它们插入到每个文件的 (General) (Declarations) 部分中,如下所示:

#If False Then
    Dim Index 
    Dim T 
    Dim Ctrl
    Dim C 
#End If

这将强制所有的index实例变成Index,等等。如果你看到一堆IDE编辑出现为代码更改,只需要粘贴标准的大小写,然后再次保存文件。


谢谢你提供关于大小写变化的提示,我们也遇到了同样的问题,但是我们通过一个(复杂的)脚本来解决它,该脚本将暂存文件与原始文件进行比较,并将所有大小写更改还原为原始状态。 - Gavin
@Gavin 听起来不错。你介意分享这个脚本吗? - undefined

0
有一个解决方案适用于旧的VB6-IDE和VC6-IDE,它使用MSSCCI并可以集成到提供MSSCC接口的任何IDE中进行源代码控制。 你可以在这里找到它:Visual Git

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接