【问题标题】:How to correctly call a git submodule symlinked?如何正确调用符号链接的 git 子模块?
【发布时间】:2017-06-16 14:30:31
【问题描述】:

关于 Sublime Text Package Control 问题:

  1. Why ignore VCS-based packages accordingly to this message?

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

因为All Autocomplete是一个子模块,所以它的gits文件在:

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

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

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

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

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

我在 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)

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

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

如何使用 subprocess.Popen() 调用符号链接的 git 子模块以正常调用未符号链接到 gitdir: ../.git/modules/ 的 git 子模块,从而生成输出 (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
>>>

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

  1. How to correctly call a git submodule symlinked?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-19
      • 2016-01-17
      • 2023-01-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-03
      • 2018-06-06
      • 2013-04-01
      • 2018-06-23
      相关资源
      最近更新 更多