feature: supports to use git-credential-libsecret instead of git-credential-manager on Linux (#1560)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo
2025-07-16 16:26:28 +08:00
parent 5ed2c7b793
commit dba6b7555e
7 changed files with 50 additions and 11 deletions

View File

@@ -153,7 +153,6 @@ namespace SourceGit.Commands
{
var start = new ProcessStartInfo();
start.FileName = Native.OS.GitExecutable;
start.Arguments = "--no-pager -c core.quotepath=off -c credential.helper=manager ";
start.UseShellExecute = false;
start.CreateNoWindow = true;
@@ -182,16 +181,27 @@ namespace SourceGit.Commands
start.Environment.Add("LC_ALL", "C");
}
// Force using this app as git editor.
start.Arguments += Editor switch
{
EditorType.CoreEditor => $"""-c core.editor="\"{selfExecFile}\" --core-editor" """,
EditorType.RebaseEditor => $"""-c core.editor="\"{selfExecFile}\" --rebase-message-editor" -c sequence.editor="\"{selfExecFile}\" --rebase-todo-editor" -c rebase.abbreviateCommands=true """,
_ => "-c core.editor=true ",
};
var builder = new StringBuilder();
builder
.Append("--no-pager -c core.quotepath=off -c credential.helper=")
.Append(Native.OS.CredentialHelper)
.Append(' ');
// Append command args
start.Arguments += Args;
switch (Editor)
{
case EditorType.CoreEditor:
builder.Append($"""-c core.editor="\"{selfExecFile}\" --core-editor" """);
break;
case EditorType.RebaseEditor:
builder.Append($"""-c core.editor="\"{selfExecFile}\" --rebase-message-editor" -c sequence.editor="\"{selfExecFile}\" --rebase-todo-editor" -c rebase.abbreviateCommands=true """);
break;
default:
builder.Append("-c core.editor=true ");
break;
}
builder.Append(Args);
start.Arguments = builder.ToString();
// Working directory
if (!string.IsNullOrEmpty(WorkingDirectory))

View File

@@ -58,6 +58,12 @@ namespace SourceGit.Native
private set;
} = new Version(0, 0, 0);
public static string CredentialHelper
{
get;
set;
} = "manager";
public static string ShellOrTerminal
{
get;

View File

@@ -555,6 +555,7 @@
<x:String x:Key="Text.Preferences.Git.Invalid" xml:space="preserve">Git (&gt;= 2.25.1) is required by this app</x:String>
<x:String x:Key="Text.Preferences.Git.Path" xml:space="preserve">Install Path</x:String>
<x:String x:Key="Text.Preferences.Git.SSLVerify" xml:space="preserve">Enable HTTP SSL Verify</x:String>
<x:String x:Key="Text.Preferences.Git.UseLibsecret" xml:space="preserve">Use git-credential-libsecret instead of git-credential-manager</x:String>
<x:String x:Key="Text.Preferences.Git.User" xml:space="preserve">User Name</x:String>
<x:String x:Key="Text.Preferences.Git.User.Placeholder" xml:space="preserve">Global git user name</x:String>
<x:String x:Key="Text.Preferences.Git.Version" xml:space="preserve">Git version</x:String>

View File

@@ -559,6 +559,7 @@
<x:String x:Key="Text.Preferences.Git.Invalid" xml:space="preserve">本软件要求GIT最低版本为2.25.1</x:String>
<x:String x:Key="Text.Preferences.Git.Path" xml:space="preserve">安装路径</x:String>
<x:String x:Key="Text.Preferences.Git.SSLVerify" xml:space="preserve">启用HTTP SSL验证</x:String>
<x:String x:Key="Text.Preferences.Git.UseLibsecret" xml:space="preserve">使用 git-credential-libsecret 替代 git-credential-manager</x:String>
<x:String x:Key="Text.Preferences.Git.User" xml:space="preserve">用户名</x:String>
<x:String x:Key="Text.Preferences.Git.User.Placeholder" xml:space="preserve">默认GIT用户名</x:String>
<x:String x:Key="Text.Preferences.Git.Version" xml:space="preserve">Git 版本</x:String>

View File

@@ -559,6 +559,7 @@
<x:String x:Key="Text.Preferences.Git.Invalid" xml:space="preserve">本軟體要求 Git 最低版本為 2.25.1</x:String>
<x:String x:Key="Text.Preferences.Git.Path" xml:space="preserve">安裝路徑</x:String>
<x:String x:Key="Text.Preferences.Git.SSLVerify" xml:space="preserve">啟用 HTTP SSL 驗證</x:String>
<x:String x:Key="Text.Preferences.Git.UseLibsecret" xml:space="preserve">使用 git-credential-libsecret 取代 git-credential-manager</x:String>
<x:String x:Key="Text.Preferences.Git.User" xml:space="preserve">使用者名稱</x:String>
<x:String x:Key="Text.Preferences.Git.User.Placeholder" xml:space="preserve">預設 Git 使用者名稱</x:String>
<x:String x:Key="Text.Preferences.Git.Version" xml:space="preserve">Git 版本</x:String>

View File

@@ -310,6 +310,20 @@ namespace SourceGit.ViewModels
set => SetProperty(ref _gitDefaultCloneDir, value);
}
public bool UseLibsecretInsteadOfGCM
{
get => Native.OS.CredentialHelper.Equals("libsecret", StringComparison.Ordinal);
set
{
var helper = value ? "libsecret" : "manager";
if (OperatingSystem.IsLinux() && !Native.OS.CredentialHelper.Equals(helper, StringComparison.Ordinal))
{
Native.OS.CredentialHelper = helper;
OnPropertyChanged();
}
}
}
public int ShellOrTerminal
{
get => _shellOrTerminal;

View File

@@ -279,7 +279,7 @@
<TextBlock Classes="tab_header" Text="{DynamicResource Text.Preferences.Git}"/>
</TabItem.Header>
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32,32" ColumnDefinitions="Auto,*">
<Grid Margin="8" RowDefinitions="32,32,32,32,32,32,32,32,Auto" ColumnDefinitions="Auto,*">
<TextBlock Grid.Row="0" Grid.Column="0"
Text="{DynamicResource Text.Preferences.Git.Path}"
HorizontalAlignment="Right"
@@ -366,6 +366,12 @@
Height="32"
Content="{DynamicResource Text.Preferences.Git.SSLVerify}"
IsChecked="{Binding #ThisControl.EnableHTTPSSLVerify, Mode=TwoWay}"/>
<CheckBox Grid.Row="8" Grid.Column="1"
Height="32"
Content="{DynamicResource Text.Preferences.Git.UseLibsecret}"
IsChecked="{Binding UseLibsecretInsteadOfGCM, Mode=TwoWay}"
IsVisible="{OnPlatform False, Linux=True}"/>
</Grid>
</TabItem>