[英]How to correctly call a git submodule symlinked?
关于Sublime Text Package Control问题:
我找出导致此错误的原因。 我已经触发了All Autocomplete
软件包。 然后我去了Packages/All Autocomplete
文件夹,发现它是一个git repo synlink。 然后,我删除了指向gitdir: ../.git/modules/All Autocomplete
的.git
文件gitdir: ../.git/modules/All Autocomplete
.git
gitdir: ../.git/modules/All Autocomplete
并重新克隆了存储库,因此其文件位于存储库中。 然后,程序包控件停止为该程序包All Autocomplete
抛出错误,并开始对下一个程序包(也是git子模块,并将.git
同步链接到父git文件夹)执行相同的错误。
这是因为“ All Autocomplete
是一个子模块,因此其gits文件位于:
gitdir: ../.git/modules/All Autocomplete
现在您可以复制它,但是您需要:
All Autocomplete
作为子模块。 git clone --recursive
安装克隆您的Package
文件夹存储库 这将创建All Autocomplete
作为git子模块,并将其文件存储在父git文件夹中:
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/master\n', None)
>>>
在第一个命令中,我使用包amxmodx
,该包具有链接到gitdir: ../.git/modules/amxmodx
的.git
文件gitdir: ../.git/modules/amxmodx
. .git
gitdir: ../.git/modules/amxmodx
。 然后我们得到了输出(b'', None)
。
在第二个命令中,我使用其中包含.git
文件夹的软件包All Autocomplete
,因为我只是将其克隆为git子模块。 因此,由于其安装不是通过git clone --recursive
, .git
是一个文件夹,并且不是与gitdir: ../.git/modules/
链接的gitdir: ../.git/modules/
.git gitdir: ../.git/modules/
,因此它具有实际的git文件内容。
因此,我们得到了输出(b'refs/heads/master\\n', None)
,它可以正常工作,并使程序包控件不会引发错误。
如何使用subprocess.Popen()
来调用gitdir: ../.git/modules/
链接的git子模块,使其作为未gitdir: ../.git/modules/
链接到gitdir: ../.git/modules/
的git子模块的调用而正常工作gitdir: ../.git/modules/
git (b'refs/heads/master\\n', None)
会产生输出(b'refs/heads/master\\n', 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
>>>
我也在Windows的git上为此打开了一个问题:
我只是想出了问题。 当我执行git clone --recursive
,子模块不在其默认分支上签出,因此命令git.exe symbolic-ref -q HEAD
返回始终为空。
解决方法是转到每个子模块并执行git checkout master或main默认分支,因此该命令将正常运行并返回所需的值:
>>> 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
>>>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.