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

时间:2017-06-16 14:30:32

标签: python git python-3.x subprocess sublimetext3

关于Sublime Text Package Control问题:

  1. Why ignore VCS-based packages accordingly to this message?
  2. 我找出导致此错误的原因。我有一个包All Autocomplete触发它。然后我去了Packages/All Autocomplete文件夹,发现它是一个git repo synlinked。然后我删除了.git文件,该文件指向gitdir: ../.git/modules/All Autocomplete并重新存储了存储库,因此其文件位于repo中。然后包控制停止抛出包All Autocomplete的错误,并开始为下一个包执行相同的错误,该包也是一个git子模块,并且.git与父git文件夹同步。

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

    1. gitdir: ../.git/modules/All Autocomplete
    2. 现在你可以重现它,但你需要:

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

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

        1. gitdir: ../.git/modules/All Autocomplete
        2. 我在git子模块symliked上调用这个子进程:

          我使用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文件符号链接到.git的包gitdir: ../.git/modules/amxmodx。我们得到了输出(b'', None)

          在第二个命令中,我使用包含All Autocomplete文件夹的包.git,因为我只是将其克隆为git子模块。因此,git clone --recursive不是.git,而是gitdir: ../.git/modules/ 一个文件夹,并且不是符号链接到(b'refs/heads/master\n', None),它上面有实际的git文件内容。

          因此我们得到了输出subprocess.Popen(),它正常工作并使包控制不会抛出错误。

          如何调用带有gitdir: ../.git/modules/的符号链接git子模块作为对未与(b'refs/heads/master\n', None)进行符号链接的git子模块的调用,从而生成输出(b'', None)而不是{{ 1}}用于符号链接的子模块?

          我的系统信息/版本是:

          $ 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. How to correctly call a git submodule symlinked?

1 个答案:

答案 0 :(得分:0)

我刚才发现了问题。当我执行git clone --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
>>>