如何正确调用 git 子模块符号链接?



关于Sublime Text Package Control问题:

  1. 为什么要根据此消息忽略基于 VCS 的软件包?

我找出导致此错误的原因。我有包All Autocomplete触发它。然后我去了文件夹Packages/All Autocomplete,注意到它是一个 git 存储库 synlink。然后我删除了指向gitdir: ../.git/modules/All Autocomplete.git文件并重新克隆了存储库,因此其文件位于存储库中。然后包控件停止为包All Autocomplete抛出错误,并开始对下一个包执行相同的错误,该包也是一个 git 子模块,并且.git链接到父 git 文件夹。

这是因为All Autocomplete是一个子模块,因此它的 gits 文件位于:

  1. gitdir: ../.git/modules/All Autocomplete

现在您可以重现它,但您需要:

  1. 使包文件夹成为 git 存储库,并将All Autocomplete添加为子模块。
  2. 删除它,然后安装克隆Package文件夹存储库,git clone --recursive

这会将All Autocomplete创建为 git 子模块,并将其文件存储在父 git 文件夹中:

  1. gitdir: ../.git/modules/All Autocomplete

我在 git 子模块上调用这个子进程:

我使用 python 解释器做了一些测试,这是proc = subprocess.Popen()的问题:

>>> import os
>>> import subprocess
>>> startupinfo = subprocess.STARTUPINFO();startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW;
>>> proc = subprocess.Popen( ['C:/Program Files (x86)/Git/bin/git.exe', 'symbolic-ref', '-q', 'HEAD'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=startupinfo, cwd='D:/SublimeText/Data/Packages/amxmodx', env=os.environ )
>>> proc.communicate()
(b'', None)
>>> proc = subprocess.Popen( ['C:/Program Files (x86)/Git/bin/git.exe', 'symbolic-ref', '-q', 'HEAD'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, startupinfo=startupinfo, cwd='D:/SublimeText/Data/Packages/All Autocomplete', env=os.environ )
>>> proc.communicate()
(b'refs/heads/mastern', None)
>>>

在第一个命令中,我使用包amxmodx,它具有链接到gitdir: ../.git/modules/amxmodx.git文件符号。我们得到了输出(b'', None).

在第二个命令中,我使用包All Autocomplete,其中包含.git文件夹,因为我只是将其克隆为 git 子模块。因此,由于它的安装不是由git clone --recursive.git是 一个文件夹,并且不是链接到gitdir: ../.git/modules/的符号,它上面有实际的 git 文件内容。

因此,我们得到了输出(b'refs/heads/mastern', None),它工作正常,并使包控件不会抛出错误。

如何使用subprocess.Popen()对符号链接的 git 子模块进行调用,以正常工作,作为对未符号链接到gitdir: ../.git/modules/的 git 子模块的调用,该子模块生成输出(b'refs/heads/mastern', None)而不是符号链接子模块的(b'', None)


我的系统信息/版本是:

$ git --version
git version 2.13.0.windows.1
$ systeminfo | findstr /B /C:"OS Version"
OS Version:                10.0.15063 N/A Build 15063
$ python --version
Python 3.6.1 :: Anaconda 4.4.0 (32-bit)

更新

我也尝试使用os.system

>>> cur_dir = os.getcwd()
>>> os.chdir(r'D:/SublimeText/Data/Packages/All Autocomplete')
>>> os.getcwd()
'D:\SublimeText\Data\Packages\All Autocomplete'
>>> os.system( r'"C:/Program Files (x86)/Git/bin/git.exe" symbolic-ref -q HEAD' )
refs/heads/master
0
>>> os.chdir(r'D:/SublimeText/Data/Packages/amxmodx')
>>> os.system( r'"C:/Program Files (x86)/Git/bin/git.exe" symbolic-ref -q HEAD' )
1
>>>

我还在 git for Windows 上为此打开了一个问题:

  1. 如何正确调用 git 子模块符号链接?

我刚刚弄清楚了问题。当我做 gitclone --recursive子模块没有在其默认分支上签出时,因此命令git.exe symbolic-ref -q HEAD返回始终为空。

解决方案只是转到每个子模块并执行 git checkout master 或主默认分支,因此该命令将正常工作并返回所需的值:

>>> cur_dir = os.getcwd()
>>> os.chdir(r'D:/SublimeText/Data/Packages/All Autocomplete')
>>> os.getcwd()
'D:\SublimeText\Data\Packages\All Autocomplete'
>>> os.system( r'"C:/Program Files (x86)/Git/bin/git.exe" symbolic-ref -q HEAD' )
refs/heads/master
0
>>> os.chdir(r'D:/SublimeText/Data/Packages/amxmodx')
>>> os.system( r'"C:/Program Files (x86)/Git/bin/git.exe" symbolic-ref -q HEAD' )
refs/heads/master
0
>>>

最新更新