Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 24 additions & 3 deletions git-partial-submodule.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,14 +111,21 @@ def ReadGitmodules(worktreeRoot):
gitmodules.byPath[contents['path']] = contents
return gitmodules

def ResolveBranch(branchName):
if branchName == '.':
return repoBranch
return branchName

# Version 2.27.0 is needed for --filter and --sparse options on git clone
CheckGitVersion((2, 27, 0))

# Locate directories
worktreeRoot = os.path.abspath(ReadGitOutput('rev-parse', '--show-toplevel').strip())
repoRoot = os.path.abspath(ReadGitOutput('rev-parse', '--git-dir').strip())
repoUrl = ReadGitOutput('config', '--get', 'remote.origin.url').strip()
repoBranch = ReadGitOutput('rev-parse', '--abbrev-ref', 'HEAD').strip()
if args.verbose:
print("worktree root: %s\nrepo root: %s" % (worktreeRoot, repoRoot))
print("worktree root: %s\nrepo root: %s\nrepo url: %s\nrepo branch: %s" % (worktreeRoot, repoRoot, repoUrl, repoBranch))

# Process commands

Expand Down Expand Up @@ -227,13 +234,27 @@ def ReadGitmodules(worktreeRoot):
os.makedirs(os.path.dirname(submoduleRepoRoot), exist_ok=True)
os.makedirs(submoduleWorktreeRoot, exist_ok=True) # Should have been created by 'git submodule init', but just make sure

# Resolve relative submodule url
join = False
subUrl = submodule['url']
baseUrl = repoUrl
while subUrl.startswith('./') or subUrl.startswith('../'):
join = True
if subUrl.startswith('./'):
subUrl = subUrl[2:]
else:
subUrl = subUrl[3:]
baseUrl = os.path.split(baseUrl)[0]
if join:
subUrl = baseUrl+'/'+subUrl

# Perform the partial clone!!!
Git('clone',
'--filter=blob:none',
'--no-checkout',
'--separate-git-dir', submoduleRepoRoot,
*(['--branch', branchName] if (branchName := submodule.get('branch')) else []),
submodule['url'],
*(['--branch', ResolveBranch(branchName)] if (branchName := submodule.get('branch')) else []),
subUrl,
submoduleWorktreeRoot)

# Apply sparse-checkout patterns in the submodule worktree
Expand Down