使用Git和VB6

问题描述 投票:15回答:7

我们公司在VB6中有一个很大的代码库,我们目前使用VSS,尽管我们讨厌它,但它至少集成到了VB6 IDE中。

我自己的团队,正在使用.NET,现在正在寻找替代的SCM,比如我个人最喜欢的Git。使用Git Extensions,我们似乎能够很好地将Git命令集成到Visual Studio IDE中。

但是,有人问过这个问题:Git也可以用于我们的VB6代码库吗?

当然我假设文件本身在git存储库中可以正常工作,但毫无疑问,开发人员会抱怨他们是否必须使用命令行来完成所有源代码控制。但有没有人有使用VB6和Git的经验? VB6 IDE中可以进行任何集成吗?或者,没有IDE集成可能没那么麻烦?

我是否会获得第一个创建[vb6]和[git]的荒谬标签组合的徽章?

git vb6 version-control dvcs
7个回答
14
投票

我发现这个解决方案适用于我们的情况。它为以前的答案增加了一点,并解决了我们的项目与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>

6
投票

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

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

4
投票

你最了解你的开发者。他们会介意使用命令行吗?他们是否热衷于IDE集成?这些是个人喜好。

确保最受尊敬的开发人员了解git的好处并且是决策背后的原因。

请注意,某些VB6源文件是二进制文件和shouldn't ever be merged:例如.frx文件。我不知道git,所以我不知道这是不是问题。


3
投票

VB6作为代码库(即文本文件)有什么不同,使它不适合git?

文化完全是另一回事:如果你有大量不称职的开发人员无法处理命令行,那么治愈可能包括尽可能远离VB6。

唯一可能的问题是,git世界中的窗口有点像二等公民。如果您发现git在您的环境中不能很好地工作,您可能想尝试bazaar或mercurial。


3
投票

我们这样做。我们已将以下内容添加到.gitIgnore中

  • *的.csi
  • * .EXP
  • * .LIB
  • * .lvw
  • * .vbw
  • MyProject.dll

3
投票

你必须创建文件.gitattributes来使用windows line endings(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

2
投票

这真的是对KeithTheBiped等人的其他优秀评论的补充......

但是,有可能稍微强制VB6中的立即窗口就像一个现代终端窗口,有一些警告。如果我们创建一个帮助函数来运行命令,以某种方式捕获输出,然后使用Debug.Print将其中继回到立即窗口SIMILAR到终端窗口,但当然没有任何交互元素。

这适用于大多数命令,但无法捕获git push阶段的某些输出。一个可接受的妥协,为了方便没有shell(imo)。

我们可以使用命令提示符(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,并在立即窗口中显示MOST,并且可以使用它,但我们可以做得更好。

假设您已经安装了命令行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

从这里,您可以从即时窗口ALMOST运行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
© www.soinside.com 2019 - 2024. All rights reserved.