在VB6中使用Git

llmtgqce  于 2023-08-01  发布在  Git
关注(0)|答案(9)|浏览(145)

我们公司有一个很大的VB6代码库,我们目前使用VSS,尽管我们讨厌它,但它至少集成到了VB6 IDE中。
我自己的团队正在使用.NET,现在正在研究替代SCM,比如我个人最喜欢的Git。有了Git Extensions,我们似乎可以很好地将Git命令集成到Visual Studio IDE中。
然而,有人提出了这样一个问题:Git也可以用于我们的VB6代码库吗?
当然,我假设文件本身在git仓库中可以正常工作,但毫无疑问,如果开发人员不得不使用命令行来完成所有的源代码控制,他们会抱怨。有没有人使用过VB6和Git?在VB6 IDE中有任何可用的集成吗?或者,没有IDE集成可能没有那么多麻烦?
我是第一个创建[vb6]和[git]的荒谬标签组合的人,我能得到一枚徽章吗?

xdnvmnnf

xdnvmnnf1#

我发现这个解决方案在我们的情况下起作用。它为前面的答案增加了一些内容,解决了我们在使用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>

vsnjm48y

vsnjm48y2#

使用Git管理VB 6项目已经有一年了。从未遇到过任何IDE集成。就我个人而言,我喜欢命令行,所以我没有看太多。我遇到的两个主要问题是:

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

gc0ot86w3#

你必须创建一个文件**.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

rta7y2nd

rta7y2nd4#

这真的是一个除了其他优秀的评论KeithTheBiped,等。
但是,有可能在某种程度上强制VB 6中的即时窗口,使其像一个现代的终端窗口,但有一些注意事项。如果我们创建一个helper函数来运行命令,以某种方式捕获输出,然后使用Debug.Print将其中继回即时窗口类似于终端窗口,但没有任何交互元素。
这适用于大多数命令,但无法捕获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,并在即时窗口中显示大多数内容,可以像这样简单地使用它,但我们可以做得更好。
假设你已经安装了一个命令行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

shyt4zoc

shyt4zoc5#

你最了解你的开发者。他们会介意使用命令行吗?他们热衷于IDE集成吗?这些都是个人喜好。
确保最受尊敬的开发人员了解git的好处,并支持决策。
请注意,一些VB6源文件是二进制和shouldn't ever be merged的:例如.frx文件。我不认识饭桶,所以我不知道这是否是个问题。

wgx48brx

wgx48brx6#

VB6作为一个代码库有什么不同(即文本文件),这使得它不适合git?
文化则完全是另一回事:如果你有很多不称职的开发人员,他们不能处理命令行,那么治疗方法可能包括尽可能远离VB6。
唯一潜在的问题是windows在git世界中有点像二等公民。如果你发现git在你的环境中不能很好地工作,你可能想尝试一下bazaar或mercurial。

t8e9dugd

t8e9dugd7#

我们要这么做我们在.gitIgnore中添加了以下内容

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

mzsu5hc08#

我正在使用Atlassian Source树来管理我在git仓库中的VB6项目。工作正常。
如前所述,一个障碍是,当在IDE中定义标识符时,IDE会关闭并更改匹配标识符的大小写,而这些更改会产生虚假的更改。
解决方案是在文本文件中保留一个标识符块,并根据需要将它们放入每个文件的(General)(Declarations)部分,如下所示:

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

字符串
这将强制index的所有示例为Index,等等。如果您得到一堆IDE编辑显示为代码更改,您只需粘贴标准大小写,并再次保存文件。

zbdgwd5y

zbdgwd5y9#

有一个解决方案,为旧的VB 6-IDE,VC6-IDE使用MSSCCI,并可以集成在每个IDE提供MSSCC接口的源代码控制。你可以在这里找到Visual Git

相关问题