Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
9ba27f1
Report the real reason a mount fails instead of a broken pipe
tyrielv Sep 1, 2026
d4ddf6b
Address self-review findings on the mount failure reporting fix
tyrielv Sep 1, 2026
14cdfdf
Extract the mount-failure handshake into MountFailureReporter
tyrielv Sep 2, 2026
974b651
Tighten the MountFailureReporter surface and its test coverage
tyrielv Sep 2, 2026
3f62f71
Use worktree-specific git index paths
tyrielv Sep 23, 2026
bdb1223
Harden worktree dehydrate safeguards
tyrielv Sep 23, 2026
f6fbfc4
Improve missing disk layout metadata error
tyrielv Sep 24, 2026
881644e
Address missing layout review feedback
tyrielv Sep 25, 2026
17678b4
Capture and surface the real failure when placeholder hydration fails
tyrielv Sep 30, 2026
68ec039
Merge pull request #2124 from tyrielv/tyrielv/hydratefile-hresult
tyrielv Oct 12, 2026
0ccec54
Address disk layout review follow-up
tyrielv Oct 13, 2026
6635e93
Pin and document GitProcess git-dir resolution in linked worktrees
tyrielv Aug 28, 2026
5acdc4d
Address review feedback on git-dir resolution comments and tests
tyrielv Oct 14, 2026
c813da5
Bump actions/upload-artifact from 7.0.1 to 7.0.2
dependabot[bot] Oct 14, 2026
2131775
Bump actions/download-artifact from 8.0.1 to 8.0.2
dependabot[bot] Oct 14, 2026
7cf7c9a
Merge pull request #2136 from microsoft/dependabot/github_actions/act…
tyrielv Oct 14, 2026
c5ea3d5
Merge pull request #2135 from microsoft/dependabot/github_actions/act…
tyrielv Oct 14, 2026
d84568b
Keep a failing mount from crashing, and make its tests deterministic
tyrielv Oct 14, 2026
171f14a
Do not trace raw credential output
tyrielv Aug 28, 2026
9dbaa43
Reject credential output that lacks the requested key
tyrielv Oct 7, 2026
a4d73af
Keep credential stderr out of telemetry and bound the traced output
tyrielv Oct 7, 2026
81a6994
Report a rejected credential in telemetry and read output like git
tyrielv Oct 13, 2026
0a3f274
Keep stderr out of the returned credential error message
tyrielv Oct 15, 2026
df237df
Correct the git-dir comment and restore an EOF line ending
tyrielv Oct 15, 2026
73d64a5
fix: address worktree index review feedback
tyrielv Oct 15, 2026
2c1c630
fix: handle worktree path and backup failure boundaries
tyrielv Oct 15, 2026
439c98a
Address disk layout follow-up review
tyrielv Oct 15, 2026
bc2b815
Ignore worktree metadata directories without gitdir files
tyrielv Oct 15, 2026
bdd7c31
Match Git when worktree registration entries are omitted
tyrielv Oct 15, 2026
ed86feb
Update default Microsoft Git version to v2.56.0.vfs.0.2
dscho Oct 20, 2026
e1981c7
Merge pull request #2140 from microsoft/automation/gitrelease-v2.56.0…
dscho Oct 20, 2026
64f6ad8
Avoid GVFS command locks for read-only Git operations
tyrielv Oct 19, 2026
da31d98
Preserve hydration summary diagnostics across failures and cache fall…
tyrielv Oct 21, 2026
75f1fed
Correct hydration diagnostic policy boundaries and strengthen contrac…
tyrielv Oct 23, 2026
d800cfe
Wait for hydration cache state in health functional tests
tyrielv Oct 23, 2026
1324889
Update default Microsoft Git version to v2.56.0.vfs.0.4
dscho Oct 26, 2026
2596926
Merge pull request #2145 from microsoft/automation/gitrelease-v2.56.0…
dscho Oct 26, 2026
5659edb
Merge pull request #2101 from tyrielv/tyrielv/redact-credential-telem…
tyrielv Oct 27, 2026
6940eab
Merge pull request #2105 from tyrielv/tyrielv/fix-mount-failure-repor…
tyrielv Oct 27, 2026
1e55160
Merge pull request #2102 from tyrielv/tyrielv/worktree-dotgitroot
tyrielv Oct 27, 2026
f543d02
docs: state the durable hydration diagnostic contract
tyrielv Oct 28, 2026
b28ddc5
Merge pull request #2138 from tyrielv/tyrielv/read-only-command-locks
tyrielv Oct 28, 2026
cb754df
fix: block full dehydrate on unverifiable worktree metadata
tyrielv Oct 28, 2026
124fbd2
fix: address review feedback on upgrade exception output
tyrielv Oct 28, 2026
e8fd480
Merge pull request #2113 from tyrielv/tyrielv/worktree-indexpath
tyrielv Oct 28, 2026
f2f7f78
Merge pull request #2144 from tyrielv/tyrielv/hydration-summary-diagn…
tyrielv Oct 28, 2026
5154816
Merge pull request #2118 from tyrielv/tyrielv/improve-missing-layout-…
tyrielv Oct 28, 2026
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
10 changes: 5 additions & 5 deletions .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ permissions:
checks: read

env:
GIT_VERSION: ${{ github.event.inputs.git_version || 'v2.55.0.vfs.0.10' }}
GIT_VERSION: ${{ github.event.inputs.git_version || 'v2.56.0.vfs.0.4' }}

jobs:
validate:
Expand Down Expand Up @@ -249,7 +249,7 @@ jobs:

- name: Upload microsoft/git installers
if: steps.check.outputs.result == ''
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: MicrosoftGit
path: MicrosoftGit
Expand Down Expand Up @@ -308,21 +308,21 @@ jobs:

- name: Upload functional tests drop
if: steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: FunctionalTests_${{ matrix.configuration }}_${{ matrix.architecture }}
path: artifacts\GVFS.FunctionalTests

- name: Upload FastFetch drop
if: steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: FastFetch_${{ matrix.configuration }}_${{ matrix.architecture }}
path: artifacts\FastFetch

- name: Upload GVFS installer
if: steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: GVFS_${{ matrix.configuration }}_${{ matrix.architecture }}
path: artifacts\GVFS.Installers
Expand Down
22 changes: 11 additions & 11 deletions .github/workflows/functional-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ jobs:
id: download-git
if: steps.skip.outputs.result != 'true'
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: ${{ inputs.git_artifact_name }}
path: git
Expand All @@ -90,7 +90,7 @@ jobs:

- name: Download Git installer (retry)
if: steps.skip.outputs.result != 'true' && steps.download-git.outcome == 'failure'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: ${{ inputs.git_artifact_name }}
path: git
Expand All @@ -102,7 +102,7 @@ jobs:
id: download-gvfs
if: steps.skip.outputs.result != 'true'
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: GVFS_${{ matrix.configuration }}_${{ matrix.architecture }}
path: gvfs
Expand All @@ -112,7 +112,7 @@ jobs:

- name: Download GVFS installer (retry)
if: steps.skip.outputs.result != 'true' && steps.download-gvfs.outcome == 'failure'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: GVFS_${{ matrix.configuration }}_${{ matrix.architecture }}
path: gvfs
Expand All @@ -124,7 +124,7 @@ jobs:
id: download-ft
if: steps.skip.outputs.result != 'true'
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: FunctionalTests_${{ matrix.configuration }}_${{ matrix.architecture }}
path: ft
Expand All @@ -134,7 +134,7 @@ jobs:

- name: Download functional tests drop (retry)
if: steps.skip.outputs.result != 'true' && steps.download-ft.outcome == 'failure'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: FunctionalTests_${{ matrix.configuration }}_${{ matrix.architecture }}
path: ft
Expand All @@ -145,7 +145,7 @@ jobs:
- name: Download FastFetch drop
if: steps.skip.outputs.result != 'true'
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: FastFetch_${{ matrix.configuration }}_${{ matrix.architecture }}
path: ft
Expand Down Expand Up @@ -189,7 +189,7 @@ jobs:

- name: Upload installation logs
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
continue-on-error: true
with:
name: ${{ env.ARTIFACT_PREFIX }}InstallationLogs_${{ env.FT_MATRIX_NAME }}
Expand All @@ -209,7 +209,7 @@ jobs:

- name: Upload failure diagnostics (mount dumps + logs)
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
continue-on-error: true
with:
name: ${{ env.ARTIFACT_PREFIX }}FailureDiagnostics_${{ env.FT_MATRIX_NAME }}
Expand All @@ -218,14 +218,14 @@ jobs:

- name: Upload functional test results
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: ${{ env.ARTIFACT_PREFIX }}FunctionalTests_Results_${{ env.FT_MATRIX_NAME }}
path: TestResult.xml

- name: Upload Git trace2 output
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: ${{ env.ARTIFACT_PREFIX }}GitTrace2_${{ env.FT_MATRIX_NAME }}
path: C:\temp\git-trace2.log
Expand Down
10 changes: 5 additions & 5 deletions .github/workflows/upgrade-tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,14 @@ jobs:
id: download-git
if: steps.skip.outputs.result != 'true'
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: MicrosoftGit
path: git

- name: Download Git installer (retry)
if: steps.skip.outputs.result != 'true' && steps.download-git.outcome == 'failure'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: MicrosoftGit
path: git
Expand All @@ -82,14 +82,14 @@ jobs:
id: download-gvfs
if: steps.skip.outputs.result != 'true'
continue-on-error: true
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: GVFS_${{ matrix.configuration }}_x64
path: gvfs-new

- name: Download current GVFS installer (retry)
if: steps.skip.outputs.result != 'true' && steps.download-gvfs.outcome == 'failure'
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: GVFS_${{ matrix.configuration }}_x64
path: gvfs-new
Expand Down Expand Up @@ -387,7 +387,7 @@ jobs:

- name: Upload service logs
if: always() && steps.skip.outputs.result != 'true'
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
continue-on-error: true
with:
name: UpgradeTest_Logs_${{ matrix.scenario }}
Expand Down
6 changes: 3 additions & 3 deletions GVFS/FastFetch/CheckoutPrefetcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,9 +134,9 @@ public override void Prefetch(string branchOrCommit, bool isBranch)
bool allowIndexMetadataUpdateFromWorkingTree = this.allowIndexMetadataUpdateFromWorkingTree || checkout.UpdatedWholeTree;
newIndex.UpdateFileSizesAndTimes(checkout.AddedOrEditedLocalFiles, allowIndexMetadataUpdateFromWorkingTree, shouldSignIndex, sourceIndex);

// All the slow stuff is over, so we will now move the final index into .git\index, shortly followed by
// All the slow stuff is over, so we will now move the final index into place, shortly followed by
// updating the ref files and releasing index.lock.
string indexPath = Path.Combine(this.Enlistment.DotGitRoot, GVFSConstants.DotGit.IndexName);
string indexPath = this.Enlistment.GitIndexPath;
this.Tracer.RelatedEvent(EventLevel.Informational, "MoveUpdatedIndexToFinalLocation", new EventMetadata() { { "UpdatedIndex", indexGen.TemporaryIndexFilePath }, { "Index", indexPath } });
File.Delete(indexPath);
File.Move(indexGen.TemporaryIndexFilePath, indexPath);
Expand Down Expand Up @@ -196,7 +196,7 @@ protected override void UpdateRefs(string branchOrCommit, bool isBranch, GitRefs

private Index GetSourceIndex()
{
string indexPath = Path.Combine(this.Enlistment.DotGitRoot, GVFSConstants.DotGit.IndexName);
string indexPath = this.Enlistment.GitIndexPath;

if (File.Exists(indexPath))
{
Expand Down
53 changes: 44 additions & 9 deletions GVFS/GVFS.Common/DiskLayoutUpgrades/DiskLayoutUpgrade.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ public abstract class DiskLayoutUpgrade
protected abstract int SourceMinorVersion { get; }
protected abstract bool IsMajorUpgrade { get; }

public static bool TryRunAllUpgrades(string enlistmentRoot)
public static bool TryRunAllUpgrades(string enlistmentRoot, out string error, out ReturnCode returnCode)
{
majorVersionUpgrades = new Dictionary<int, MajorUpgrade>();
minorVersionUpgrades = new Dictionary<int, Dictionary<int, MinorUpgrade>>();
error = null;
returnCode = ReturnCode.Success;

foreach (DiskLayoutUpgrade upgrade in GVFSPlatform.Instance.DiskLayoutUpgrade.Upgrades)
{
Expand All @@ -31,7 +33,7 @@ public static bool TryRunAllUpgrades(string enlistmentRoot)
try
{
DiskLayoutUpgrade upgrade = null;
while (TryFindUpgrade(tracer, enlistmentRoot, out upgrade))
while (TryFindUpgrade(tracer, enlistmentRoot, out upgrade, out error, out returnCode))
{
if (upgrade == null)
{
Expand All @@ -40,11 +42,13 @@ public static bool TryRunAllUpgrades(string enlistmentRoot)

if (!upgrade.TryUpgrade(tracer, enlistmentRoot))
{
returnCode = ReturnCode.GenericError;
return false;
}

if (!CheckLayoutVersionWasIncremented(tracer, enlistmentRoot, upgrade))
{
returnCode = ReturnCode.GenericError;
return false;
}
}
Expand All @@ -55,6 +59,8 @@ public static bool TryRunAllUpgrades(string enlistmentRoot)
{
StartLogFile(enlistmentRoot, tracer);
tracer.RelatedError(e.ToString());
error = e.Message;
returnCode = ReturnCode.GenericError;
return false;
}
finally
Expand All @@ -64,17 +70,19 @@ public static bool TryRunAllUpgrades(string enlistmentRoot)
}
}

public static bool TryCheckDiskLayoutVersion(ITracer tracer, string enlistmentRoot, out string error)
public static bool TryCheckDiskLayoutVersion(ITracer tracer, string enlistmentRoot, out string error, out ReturnCode returnCode)
{
error = string.Empty;
returnCode = ReturnCode.Success;
int majorVersion;
int minorVersion;
try
{
if (TryGetDiskLayoutVersion(tracer, enlistmentRoot, out majorVersion, out minorVersion, out error))
if (TryGetDiskLayoutVersion(tracer, enlistmentRoot, out majorVersion, out minorVersion, out error, out returnCode))
{
if (majorVersion < GVFSPlatform.Instance.DiskLayoutUpgrade.Version.MinimumSupportedMajorVersion)
{
returnCode = ReturnCode.GenericError;
error = string.Format(
"Breaking change to GVFS disk layout has been made since cloning. \r\nEnlistment disk layout version: {0} \r\nGVFS disk layout version: {1} \r\nMinimum supported version: {2}",
majorVersion,
Expand All @@ -85,6 +93,7 @@ public static bool TryCheckDiskLayoutVersion(ITracer tracer, string enlistmentRo
}
else if (majorVersion > GVFSPlatform.Instance.DiskLayoutUpgrade.Version.CurrentMajorVersion)
{
returnCode = ReturnCode.GenericError;
error = string.Format(
"Changes to GVFS disk layout do not allow mounting after downgrade. Try mounting again using a more recent version of GVFS. \r\nEnlistment disk layout version: {0} \r\nGVFS disk layout version: {1}",
majorVersion,
Expand All @@ -94,6 +103,7 @@ public static bool TryCheckDiskLayoutVersion(ITracer tracer, string enlistmentRo
}
else if (majorVersion != GVFSPlatform.Instance.DiskLayoutUpgrade.Version.CurrentMajorVersion)
{
returnCode = ReturnCode.GenericError;
error = string.Format(
"GVFS disk layout version doesn't match current version. Try running 'gvfs mount' to upgrade. \r\nEnlistment disk layout version: {0}.{1} \r\nGVFS disk layout version: {2}.{3}",
majorVersion,
Expand All @@ -112,7 +122,12 @@ public static bool TryCheckDiskLayoutVersion(ITracer tracer, string enlistmentRo
RepoMetadata.Shutdown();
}

error = "Failed to read disk layout version. " + ConsoleHelper.GetGVFSLogMessage(enlistmentRoot);
if (returnCode != ReturnCode.MissingDiskLayoutVersion)
{
returnCode = ReturnCode.GenericError;
error = "Failed to read disk layout version. " + ConsoleHelper.GetGVFSLogMessage(enlistmentRoot);
}

return false;
}

Expand Down Expand Up @@ -256,13 +271,12 @@ private static bool CheckLayoutVersionWasIncremented(JsonTracer tracer, string e
return true;
}

private static bool TryFindUpgrade(JsonTracer tracer, string enlistmentRoot, out DiskLayoutUpgrade upgrade)
private static bool TryFindUpgrade(JsonTracer tracer, string enlistmentRoot, out DiskLayoutUpgrade upgrade, out string error, out ReturnCode returnCode)
{
int majorVersion;
int minorVersion;

string error;
if (!TryGetDiskLayoutVersion(tracer, enlistmentRoot, out majorVersion, out minorVersion, out error))
if (!TryGetDiskLayoutVersion(tracer, enlistmentRoot, out majorVersion, out minorVersion, out error, out returnCode))
{
StartLogFile(enlistmentRoot, tracer);
tracer.RelatedError(error);
Expand Down Expand Up @@ -300,6 +314,8 @@ private static bool TryFindUpgrade(JsonTracer tracer, string enlistmentRoot, out

// return true to indicate that we succeeded, and no upgrader was found
upgrade = null;
error = null;
returnCode = ReturnCode.Success;
return true;
}

Expand All @@ -309,9 +325,22 @@ private static bool TryGetDiskLayoutVersion(
out int majorVersion,
out int minorVersion,
out string error)
{
ReturnCode returnCode;
return TryGetDiskLayoutVersion(tracer, enlistmentRoot, out majorVersion, out minorVersion, out error, out returnCode);
}

private static bool TryGetDiskLayoutVersion(
ITracer tracer,
string enlistmentRoot,
out int majorVersion,
out int minorVersion,
out string error,
out ReturnCode returnCode)
{
majorVersion = 0;
minorVersion = 0;
returnCode = ReturnCode.GenericError;

string dotGVFSPath = Path.Combine(enlistmentRoot, GVFSPlatform.Instance.Constants.DotGVFSRoot);

Expand All @@ -323,13 +352,19 @@ private static bool TryGetDiskLayoutVersion(
return false;
}

if (!RepoMetadata.Instance.TryGetOnDiskLayoutVersion(out majorVersion, out minorVersion, out error))
if (!RepoMetadata.Instance.TryGetOnDiskLayoutVersion(out majorVersion, out minorVersion, out error, out returnCode))
{
if (returnCode == ReturnCode.MissingDiskLayoutVersion)
{
error += " " + ConsoleHelper.GetGVFSLogMessage(enlistmentRoot);
}

return false;
}
}

error = null;
returnCode = ReturnCode.Success;
return true;
}

Expand Down
6 changes: 6 additions & 0 deletions GVFS/GVFS.Common/Enlistment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ protected Enlistment(
public string WorkingDirectoryRoot { get; }
public string WorkingDirectoryBackingRoot { get; }

/// <summary>
/// Path to the git directory that holds the repository metadata GVFS reads or writes
/// directly. The default is "&lt;WorkingDirectoryBackingRoot&gt;\.git", which is a file in a
/// linked worktree. Enlistments that support linked worktrees must set it to the
/// shared (common) git directory during construction.
/// </summary>
public string DotGitRoot { get; protected set; }
public abstract string GitObjectsRoot { get; protected set; }
public abstract string LocalObjectsRoot { get; protected set; }
Expand Down
Loading
Loading