我们公司在VB6中有一个很大的代码库,我们目前使用VSS,尽管我们讨厌它,但它至少集成到了VB6 IDE中。
我自己的团队,正在使用.NET,现在正在寻找替代的SCM,比如我个人最喜欢的Git。使用Git Extensions,我们似乎能够很好地将Git命令集成到Visual Studio IDE中。
但是,有人问过这个问题:Git也可以用于我们的VB6代码库吗?
当然我假设文件本身在git存储库中可以正常工作,但毫无疑问,开发人员会抱怨他们是否必须使用命令行来完成所有源代码控制。但有没有人有使用VB6和Git的经验? VB6 IDE中可以进行任何集成吗?或者,没有IDE集成可能没那么麻烦?
我是否会获得第一个创建[vb6]和[git]的荒谬标签组合的徽章?
我发现这个解决方案适用于我们的情况。它为以前的答案增加了一点,并解决了我们的项目与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>
已经使用Git来管理VB6项目大约一年了。从未遇到任何IDE集成。我个人喜欢命令行,所以我看起来并不多。我遇到的两个主要问题是:
你最了解你的开发者。他们会介意使用命令行吗?他们是否热衷于IDE集成?这些是个人喜好。
确保最受尊敬的开发人员了解git的好处并且是决策背后的原因。
请注意,某些VB6源文件是二进制文件和shouldn't ever be merged:例如.frx
文件。我不知道git,所以我不知道这是不是问题。
VB6作为代码库(即文本文件)有什么不同,使它不适合git?
文化完全是另一回事:如果你有大量不称职的开发人员无法处理命令行,那么治愈可能包括尽可能远离VB6。
唯一可能的问题是,git世界中的窗口有点像二等公民。如果您发现git在您的环境中不能很好地工作,您可能想尝试bazaar或mercurial。
我们这样做。我们已将以下内容添加到.gitIgnore中
你必须创建文件.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
这真的是对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
你会需要:
完成此操作后,可以成功运行任何简单的执行并输出到立即窗口,如下所示:
?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