diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml
index 0845774fb3..9397d78e2b 100644
--- a/.github/workflows/package.yml
+++ b/.github/workflows/package.yml
@@ -103,6 +103,7 @@ jobs:
name: package.${{ matrix.runtime }}
path: |
build/sourcegit-*.AppImage
+ build/sourcegit-*.AppImage.zsync
build/sourcegit_*.deb
build/sourcegit-*.rpm
- name: Delete temp artifacts
diff --git a/README.md b/README.md
index 53baa34274..2ac5ba0723 100644
--- a/README.md
+++ b/README.md
@@ -200,6 +200,25 @@ For `OrcaRouter`:
* `API Key` should be an OrcaRouter API key (prefixed with `sk-orca-`)
* A good starting `Model` is `orcarouter/auto`, which routes each request to the best available model
+For `Cheaper Inference`:
+
+* `Server` should be `https://api.cheaperinference.com/v1`
+* `API Key` should be a Cheaper Inference API key (prefixed with `ci_live_`)
+* A good starting `Model` is `gpt-5.4-mini`
+
+For `Opper`:
+
+* `Server` should be `https://api.opper.ai/v3/compat`
+* `API Key` should be an Opper API key, created at https://platform.opper.ai
+* A good starting `Model` is `gpt-5.4-mini`
+
+For `API Route`:
+
+* `Server` should be `https://global.api-route.com/v1`
+* `API Key` should be your API Route API key
+* `Model` can be `gpt-6.1-sol` if it is available to your key; otherwise select an available chat model from the fetched catalog
+* See the [API documentation](https://github.com/DennyHo0917/api-route/blob/main/API.md) for authentication and model discovery
+
For other AI service:
* The `Server` should fill in a URL equivalent to OpenAI's `https://api.openai.com/v1`. For example, when using `Ollama`, it should be `http://localhost:11434/v1` instead of `http://localhost:11434/api/generate`
diff --git a/TRANSLATION.md b/TRANSLATION.md
index 67becad004..0e33d6f6a4 100644
--- a/TRANSLATION.md
+++ b/TRANSLATION.md
@@ -6,13 +6,22 @@ This document shows the translation status of each locale file in the repository
### 
-### 
+### 
Missing keys in de_DE.axaml
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchTree.PushURL
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CommitDetail.Files.Tips
- Text.Dashboard
- Text.Diff.Binary.ViewContentOfNew
@@ -52,21 +61,40 @@ This document shows the translation status of each locale file in the repository
- Text.SSHKeyHelper.Path
- Text.SSHKeyHelper.PublicKey
- Text.SSHKeyHelper.Title
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.WorkingCopy.CollapseSidebar
- Text.WorkingCopy.DiscardAll
- Text.WorkingCopy.ExpandSidebar
-### 
+### 
Missing keys in el_GR.axaml
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchTree.PushURL
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CommitDetail.Files.Tips
- Text.Dashboard
- Text.Diff.Binary.ViewContentOfNew
@@ -110,8 +138,18 @@ This document shows the translation status of each locale file in the repository
- Text.SSHKeyHelper.Path
- Text.SSHKeyHelper.PublicKey
- Text.SSHKeyHelper.Title
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.WorkingCopy.CollapseSidebar
- Text.WorkingCopy.DiscardAll
- Text.WorkingCopy.ExpandSidebar
@@ -119,18 +157,9 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
-
-Missing keys in es_ES.axaml
-
-- Text.CommitDetail.Files.Tips
-- Text.WorkingCopy.CollapseSidebar
-- Text.WorkingCopy.ExpandSidebar
-
-
-
-### 
+### 
Missing keys in fr_FR.axaml
@@ -141,7 +170,16 @@ This document shows the translation status of each locale file in the repository
- Text.Bisect.WaitingForCheckoutAnother
- Text.Bisect.WaitingForFirstBad
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchTree.PushURL
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CheckoutDetached
- Text.CheckoutDetached.Target
- Text.CheckoutDetached.Warning
@@ -216,10 +254,20 @@ This document shows the translation status of each locale file in the repository
- Text.SSHKeyHelper.Path
- Text.SSHKeyHelper.PublicKey
- Text.SSHKeyHelper.Title
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.TagCM.Checkout
- Text.TagCM.Merge
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.UpdateSubmodules.Recursive
- Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder
- Text.WorkingCopy.CollapseSidebar
@@ -229,7 +277,7 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
Missing keys in he_IL.axaml
@@ -240,7 +288,16 @@ This document shows the translation status of each locale file in the repository
- Text.Bisect.WaitingForCheckoutAnother
- Text.Bisect.WaitingForFirstBad
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchTree.PushURL
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CheckoutDetached
- Text.CheckoutDetached.Target
- Text.CheckoutDetached.Warning
@@ -315,10 +372,20 @@ This document shows the translation status of each locale file in the repository
- Text.SSHKeyHelper.Path
- Text.SSHKeyHelper.PublicKey
- Text.SSHKeyHelper.Title
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.TagCM.Checkout
- Text.TagCM.Merge
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.UpdateSubmodules.Recursive
- Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder
- Text.WorkingCopy.CollapseSidebar
@@ -328,13 +395,22 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
Missing keys in id_ID.axaml
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchTree.PushURL
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CommitDetail.Files.Tips
- Text.Dashboard
- Text.Diff.Binary.ViewContentOfNew
@@ -373,8 +449,18 @@ This document shows the translation status of each locale file in the repository
- Text.SSHKeyHelper.Path
- Text.SSHKeyHelper.PublicKey
- Text.SSHKeyHelper.Title
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.WorkingCopy.CollapseSidebar
- Text.WorkingCopy.DiscardAll
- Text.WorkingCopy.ExpandSidebar
@@ -382,7 +468,7 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
Missing keys in it_IT.axaml
@@ -396,9 +482,18 @@ This document shows the translation status of each locale file in the repository
- Text.Bisect.WaitingForCheckoutAnother
- Text.Bisect.WaitingForFirstBad
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchCM.CompareWithSpecial
- Text.BranchTree.PushURL
- Text.ChangeCM.ResetFileTo
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CheckoutBranchFromStash
- Text.CheckoutBranchFromStash.Branch
- Text.CheckoutBranchFromStash.Stash
@@ -415,7 +510,6 @@ This document shows the translation status of each locale file in the repository
- Text.CommitCM.CopyCommitterTime
- Text.CommitDetail.CollapseToBottom
- Text.CommitDetail.Files.Tips
-- Text.CommitMessageTextBox.Column
- Text.Compare.Changes
- Text.Compare.Commits
- Text.Compare.Commits.LeftOnly
@@ -528,12 +622,22 @@ This document shows the translation status of each locale file in the repository
- Text.SSHKeyHelper.Title
- Text.StashCM.ApplyFileChanges
- Text.StashCM.Branch
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.SubmoduleRevisionCompare
- Text.SubmoduleRevisionCompare.OpenDetails
- Text.TagCM.Checkout
- Text.TagCM.Merge
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.UpdateSubmodules.Recursive
- Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder
- Text.WorkingCopy.CollapseSidebar
@@ -546,18 +650,37 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
Missing keys in ja_JP.axaml
+- Text.BranchCM.CheckoutAsWorktree
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CommitDetail.Files.Tips
+- Text.Statistics.Commits
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.WorkingCopy.CollapseSidebar
- Text.WorkingCopy.ExpandSidebar
-### 
+### 
Missing keys in ko_KR.axaml
@@ -565,7 +688,16 @@ This document shows the translation status of each locale file in the repository
- Text.Bisect.WaitingForCheckoutAnother
- Text.Bisect.WaitingForFirstBad
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchTree.PushURL
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CheckoutDetached
- Text.CheckoutDetached.Target
- Text.CheckoutDetached.Warning
@@ -628,10 +760,20 @@ This document shows the translation status of each locale file in the repository
- Text.SSHKeyHelper.Path
- Text.SSHKeyHelper.PublicKey
- Text.SSHKeyHelper.Title
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.TagCM.Checkout
- Text.TagCM.Merge
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.UpdateSubmodules.Recursive
- Text.WorkingCopy.AddToGitIgnore.UntrackedInSameFolder
- Text.WorkingCopy.CollapseSidebar
@@ -641,7 +783,7 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
Missing keys in pt_BR.axaml
@@ -656,6 +798,7 @@ This document shows the translation status of each locale file in the repository
- Text.Bisect.WaitingForFirstBad
- Text.Blame.BlameOnPreviousRevision
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchCM.CompareWithSpecial
- Text.BranchCM.InteractiveRebase.Manually
- Text.BranchTree.AheadBehind
@@ -674,6 +817,14 @@ This document shows the translation status of each locale file in the repository
- Text.Checkout.WarnUpdatingSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CheckoutBranchFromStash
- Text.CheckoutBranchFromStash.Branch
- Text.CheckoutBranchFromStash.Stash
@@ -713,7 +864,6 @@ This document shows the translation status of each locale file in the repository
- Text.CommitDetail.Info.CopyNameAndEmail
- Text.CommitDetail.Info.Key
- Text.CommitDetail.Info.Signer
-- Text.CommitMessageTextBox.Column
- Text.CommitMessageTextBox.Placeholder
- Text.CommitMessageTextBox.SubjectCount
- Text.Compare.Changes
@@ -1007,7 +1157,12 @@ This document shows the translation status of each locale file in the repository
- Text.StashCM.Branch
- Text.StashCM.CopyMessage
- Text.StashCM.SaveAsPatch
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.Submodule.Branch
- Text.Submodule.CopyBranch
- Text.Submodule.Deinit
@@ -1038,6 +1193,11 @@ This document shows the translation status of each locale file in the repository
- Text.TagCM.DeleteMultiple
- Text.TagCM.Merge
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.UpdateSubmodules.Recursive
- Text.UpdateSubmodules.UpdateToRemoteTrackingBranch
- Text.ViewLogs
@@ -1071,36 +1231,9 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
-
-Missing keys in ru_RU.axaml
-
-- Text.Blame.Tips
-- Text.BranchTree.PushURL
-- Text.CommitDetail.Files.Tips
-- Text.Dashboard
-- Text.Histories.AdvancedOptions
-- Text.Hotkeys.Repo.ToggleCommitDetailPanel
-- Text.Hotkeys.Repo.ToggleSearchCommits
-- Text.Hotkeys.Repo.ViewDashboard
-- Text.Preferences.AI.ExtraHeaders
-- Text.Remote.ResetPushURL
-- Text.RemoteCM.SetPushURL
-- Text.Repository.Search.Method
-- Text.Repository.Search.ToolTip
-- Text.SetPushUrl
-- Text.SetPushUrl.PushURL
-- Text.SetPushUrl.Remote
-- Text.SetPushUrl.URL
-- Text.Statistics.Tips
-- Text.WorkingCopy.CollapseSidebar
-- Text.WorkingCopy.DiscardAll
-- Text.WorkingCopy.ExpandSidebar
-
-
-
-### 
+### 
Missing keys in ta_IN.axaml
@@ -1132,6 +1265,7 @@ This document shows the translation status of each locale file in the repository
- Text.Blame.BlameOnPreviousRevision
- Text.Blame.IgnoreWhitespace
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchCM.CompareTwo
- Text.BranchCM.CompareWith
- Text.BranchCM.CompareWithHead
@@ -1162,6 +1296,14 @@ This document shows the translation status of each locale file in the repository
- Text.Checkout.WarnUpdatingSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CheckoutBranchFromStash
- Text.CheckoutBranchFromStash.Branch
- Text.CheckoutBranchFromStash.Stash
@@ -1198,7 +1340,6 @@ This document shows the translation status of each locale file in the repository
- Text.CommitDetail.Info.CopyNameAndEmail
- Text.CommitDetail.Info.Key
- Text.CommitDetail.Info.Signer
-- Text.CommitMessageTextBox.Column
- Text.CommitMessageTextBox.Placeholder
- Text.CommitMessageTextBox.SubjectCount
- Text.Compare.Changes
@@ -1451,7 +1592,12 @@ This document shows the translation status of each locale file in the repository
- Text.StashCM.ApplyFileChanges
- Text.StashCM.Branch
- Text.StashCM.CopyMessage
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.Submodule.Branch
- Text.Submodule.CopyBranch
- Text.Submodule.Deinit
@@ -1482,6 +1628,11 @@ This document shows the translation status of each locale file in the repository
- Text.TagCM.DeleteMultiple
- Text.TagCM.Merge
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.UpdateSubmodules.Target
- Text.UpdateSubmodules.Recursive
- Text.UpdateSubmodules.UpdateToRemoteTrackingBranch
@@ -1513,7 +1664,7 @@ This document shows the translation status of each locale file in the repository
-### 
+### 
Missing keys in uk_UA.axaml
@@ -1545,6 +1696,7 @@ This document shows the translation status of each locale file in the repository
- Text.Blame.BlameOnPreviousRevision
- Text.Blame.IgnoreWhitespace
- Text.Blame.Tips
+- Text.BranchCM.CheckoutAsWorktree
- Text.BranchCM.CompareTwo
- Text.BranchCM.CompareWith
- Text.BranchCM.CompareWithHead
@@ -1575,6 +1727,14 @@ This document shows the translation status of each locale file in the repository
- Text.Checkout.WarnUpdatingSubmodules
- Text.Checkout.WithFastForward
- Text.Checkout.WithFastForward.Upstream
+- Text.CheckoutAsWorktree
+- Text.CheckoutAsWorktree.LocalBranch
+- Text.CheckoutAsWorktree.NewBranchName
+- Text.CheckoutAsWorktree.NewBranchName.Placeholder
+- Text.CheckoutAsWorktree.RemoteBranch
+- Text.CheckoutAsWorktree.Tracking
+- Text.CheckoutAsWorktree.WorktreePath
+- Text.CheckoutAsWorktree.WorktreePath.Placeholder
- Text.CheckoutBranchFromStash
- Text.CheckoutBranchFromStash.Branch
- Text.CheckoutBranchFromStash.Stash
@@ -1611,7 +1771,6 @@ This document shows the translation status of each locale file in the repository
- Text.CommitDetail.Info.CopyNameAndEmail
- Text.CommitDetail.Info.Key
- Text.CommitDetail.Info.Signer
-- Text.CommitMessageTextBox.Column
- Text.CommitMessageTextBox.Placeholder
- Text.CommitMessageTextBox.SubjectCount
- Text.Compare.Changes
@@ -1860,7 +2019,12 @@ This document shows the translation status of each locale file in the repository
- Text.StashCM.ApplyFileChanges
- Text.StashCM.Branch
- Text.StashCM.CopyMessage
+- Text.Statistics.Commits
- Text.Statistics.Tips
+- Text.Statistics.TopAuthors
+- Text.Statistics.TopAuthors.Count
+- Text.Statistics.TopAuthors.Percentage
+- Text.Statistics.TopAuthors.Tip
- Text.Submodule.Branch
- Text.Submodule.CopyBranch
- Text.Submodule.Deinit
@@ -1891,6 +2055,11 @@ This document shows the translation status of each locale file in the repository
- Text.TagCM.DeleteMultiple
- Text.TagCM.Merge
- Text.Terminate
+- Text.TrustRepository
+- Text.TrustRepository.CommandTip
+- Text.TrustRepository.Description
+- Text.TrustRepository.Path
+- Text.TrustRepository.ScanSkipped
- Text.UpdateSubmodules.Recursive
- Text.UpdateSubmodules.UpdateToRemoteTrackingBranch
- Text.ViewLogs
@@ -1920,13 +2089,4 @@ This document shows the translation status of each locale file in the repository
### 
-### 
-
-
-Missing keys in zh_TW.axaml
-
-- Text.CommitDetail.Files.Tips
-- Text.WorkingCopy.CollapseSidebar
-- Text.WorkingCopy.ExpandSidebar
-
-
\ No newline at end of file
+### 
\ No newline at end of file
diff --git a/VERSION b/VERSION
index 88005f0e1c..bb71f1638b 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2026.21
\ No newline at end of file
+2026.22
\ No newline at end of file
diff --git a/build/scripts/package.linux.sh b/build/scripts/package.linux.sh
index 262f141ae8..e4645b7213 100755
--- a/build/scripts/package.linux.sh
+++ b/build/scripts/package.linux.sh
@@ -51,7 +51,9 @@ ln -rsf SourceGit.AppDir/opt/sourcegit/sourcegit SourceGit.AppDir/AppRun
ln -rsf SourceGit.AppDir/usr/share/applications/com.sourcegit_scm.SourceGit.desktop SourceGit.AppDir
cp resources/appimage/sourcegit.appdata.xml SourceGit.AppDir/usr/share/metainfo/com.sourcegit_scm.SourceGit.appdata.xml
-ARCH="$appimage_arch" ./appimagetool -v SourceGit.AppDir "sourcegit-$VERSION.linux.$arch.AppImage"
+ARCH="$appimage_arch" ./appimagetool -v \
+ -u "gh-releases-zsync|sourcegit-scm|sourcegit|latest|sourcegit-*.linux.$arch.AppImage.zsync" \
+ SourceGit.AppDir "sourcegit-$VERSION.linux.$arch.AppImage"
mkdir -p resources/deb/opt/sourcegit/
mkdir -p resources/deb/usr/bin
diff --git a/build/scripts/package.osx-app.sh b/build/scripts/package.osx-app.sh
index 62e9184f66..78c31114f4 100755
--- a/build/scripts/package.osx-app.sh
+++ b/build/scripts/package.osx-app.sh
@@ -21,5 +21,7 @@ case "$RUNTIME" in
esac
clang -arch "$ARCH" ../tools/setsid-macos/setsid.c -o SourceGit.app/Contents/MacOS/setsid -mmacosx-version-min=13.0
+codesign --force --deep --sign - SourceGit.app
+codesign --verify --deep --strict --verbose=2 SourceGit.app
zip "sourcegit_$VERSION.$RUNTIME.zip" -r SourceGit.app
diff --git a/src/App.axaml.cs b/src/App.axaml.cs
index eef4684cee..66882b4869 100644
--- a/src/App.axaml.cs
+++ b/src/App.axaml.cs
@@ -350,7 +350,7 @@ private bool TryLaunchAsFileHistoryViewer(IClassicDesktopStyleApplicationLifetim
var test = new Commands.QueryRepositoryRootPath(dir).GetResult();
if (!test.IsSuccess || string.IsNullOrEmpty(test.StdOut))
{
- Console.Out.WriteLine($"'{args[1]}' is not in a valid git repository");
+ Console.Out.WriteLine(string.IsNullOrWhiteSpace(test.StdErr) ? $"'{args[1]}' is not in a valid git repository" : test.StdErr.Trim());
desktop.Shutdown(-1);
return true;
}
@@ -395,7 +395,7 @@ private bool TryLaunchAsBlameViewer(IClassicDesktopStyleApplicationLifetime desk
var test = new Commands.QueryRepositoryRootPath(dir).GetResult();
if (!test.IsSuccess || string.IsNullOrEmpty(test.StdOut))
{
- Console.Out.WriteLine($"'{args[1]}' is not in a valid git repository");
+ Console.Out.WriteLine(string.IsNullOrWhiteSpace(test.StdErr) ? $"'{args[1]}' is not in a valid git repository" : test.StdErr.Trim());
desktop.Shutdown(-1);
return true;
}
diff --git a/src/Commands/AddSafeDirectory.cs b/src/Commands/AddSafeDirectory.cs
new file mode 100644
index 0000000000..52e190db69
--- /dev/null
+++ b/src/Commands/AddSafeDirectory.cs
@@ -0,0 +1,11 @@
+namespace SourceGit.Commands
+{
+ public class AddSafeDirectory : Command
+ {
+ public AddSafeDirectory(string ctx, string value)
+ {
+ Context = ctx;
+ Args = $"config --global --add safe.directory {value.Quoted()}";
+ }
+ }
+}
diff --git a/src/Commands/Command.cs b/src/Commands/Command.cs
index ba68bb90da..14430805c2 100644
--- a/src/Commands/Command.cs
+++ b/src/Commands/Command.cs
@@ -210,8 +210,8 @@ protected ProcessStartInfo CreateGitStartInfo(bool redirect)
if (!start.Environment.ContainsKey("GIT_SSH_COMMAND") && !string.IsNullOrEmpty(SSHKey))
start.Environment.Add("GIT_SSH_COMMAND", $"ssh -i '{SSHKey}' -o AddKeysToAgent=yes");
- // Force using en_US.UTF-8 locale
- if (OperatingSystem.IsLinux())
+ // Force the C locale on Unix, so that git's output (including fatal errors) can always be parsed.
+ if (!OperatingSystem.IsWindows())
{
start.Environment.Add("LANG", "C");
start.Environment.Add("LC_ALL", "C");
diff --git a/src/Commands/QueryLocalChanges.cs b/src/Commands/QueryLocalChanges.cs
index 31d72a0959..7c2e4156ab 100644
--- a/src/Commands/QueryLocalChanges.cs
+++ b/src/Commands/QueryLocalChanges.cs
@@ -46,8 +46,8 @@ public QueryLocalChanges(string repo, bool includeUntracked = true, bool noOptio
{
lock (capturedLock)
{
- if (captured is { Process: { HasExited: false } })
- captured.Process.Kill(true);
+ if (captured is { Process: { HasExited: false } proc })
+ Native.OS.TerminateProcess(proc);
}
});
}
diff --git a/src/Commands/Worktree.cs b/src/Commands/Worktree.cs
index 7b70e2ab49..137bb3f7f1 100644
--- a/src/Commands/Worktree.cs
+++ b/src/Commands/Worktree.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Text;
using System.Threading.Tasks;
@@ -61,20 +62,33 @@ public Worktree(string repo)
return worktrees;
}
- public async Task AddAsync(string fullpath, string name, bool createNew, string tracking)
+ public async Task AddAsync(string fullpath, string name)
+ {
+ if (string.IsNullOrEmpty(name))
+ Args = $"worktree add {fullpath.Quoted()}";
+ else
+ Args = $"worktree add -b {name} {fullpath.Quoted()}";
+
+ return await ExecAsync().ConfigureAwait(false);
+ }
+
+ public async Task AddWithLocalBranchAsync(string fullpath, string localBranch)
+ {
+ Args = $"worktree add -B {localBranch} {fullpath.Quoted()} {localBranch}";
+ return await ExecAsync().ConfigureAwait(false);
+ }
+
+ public async Task AddWithRemoteBranchAsync(string fullpath, string name, string remoteBranch, bool tracking)
{
var builder = new StringBuilder(1024);
builder.Append("worktree add ");
- if (!string.IsNullOrEmpty(tracking))
- builder.Append("--track ");
- if (!string.IsNullOrEmpty(name))
- builder.Append(createNew ? "-b " : "-B ").Append(name).Append(' ');
- builder.Append(fullpath.Quoted()).Append(' ');
-
- if (!string.IsNullOrEmpty(tracking))
- builder.Append(tracking);
- else if (!string.IsNullOrEmpty(name) && !createNew)
- builder.Append(name);
+
+ if (tracking)
+ builder.Append("--track -b ").Append(string.IsNullOrEmpty(name) ? Path.GetFileName(fullpath) : name).Append(' ');
+ else if (!string.IsNullOrEmpty(name))
+ builder.Append("-b ").Append(name).Append(' ');
+
+ builder.Append(fullpath.Quoted()).Append(' ').Append(remoteBranch);
Args = builder.ToString();
return await ExecAsync().ConfigureAwait(false);
diff --git a/src/Converters/IntConverters.cs b/src/Converters/IntConverters.cs
index 566952536b..4d6c723a8d 100644
--- a/src/Converters/IntConverters.cs
+++ b/src/Converters/IntConverters.cs
@@ -14,12 +14,6 @@ public static class IntConverters
public static readonly FuncValueConverter IsZero =
new(v => v == 0);
- public static readonly FuncValueConverter IsOne =
- new(v => v == 1);
-
- public static readonly FuncValueConverter IsNotOne =
- new(v => v != 1);
-
public static readonly FuncValueConverter ToTreeMargin =
new(v => new Thickness(v * 16, 0, 0, 0));
diff --git a/src/Models/SafeDirectories.cs b/src/Models/SafeDirectories.cs
new file mode 100644
index 0000000000..5fcf24a3af
--- /dev/null
+++ b/src/Models/SafeDirectories.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Text;
+using System.Text.RegularExpressions;
+
+namespace SourceGit.Models
+{
+ ///
+ /// Helpers for the `safe.directory` protection introduced by git 2.35.2 (CVE-2022-24765).
+ /// Git refuses to use a repository whose top-level directory is owned by another user (which is
+ /// always the case for network shares / UNC paths) unless the path is listed in the `safe.directory` config.
+ ///
+ public static partial class SafeDirectories
+ {
+ public static bool IsUntrustedRepository(string output)
+ {
+ if (string.IsNullOrWhiteSpace(output))
+ return false;
+
+ return output.Contains("detected dubious ownership", StringComparison.OrdinalIgnoreCase) ||
+ output.Contains("unsafe repository", StringComparison.OrdinalIgnoreCase);
+ }
+
+ ///
+ /// Tries to get the value that should be written into the `safe.directory` config.
+ /// Prefers the value suggested by git itself (which knows the correct form for the current platform),
+ /// and falls back to building a value from the given path.
+ ///
+ public static bool TryGetSafeDirectoryValue(string path, string output, out string value)
+ {
+ value = ParseSuggestedValue(output);
+ if (!string.IsNullOrEmpty(value))
+ return true;
+
+ var normalized = Normalize(path);
+ if (string.IsNullOrEmpty(normalized))
+ return false;
+
+ // Git for Windows uses the `%(prefix)/` prefix for UNC paths.
+ value = OperatingSystem.IsWindows() && normalized.StartsWith("//", StringComparison.Ordinal) ? $"%(prefix)/{normalized}" : normalized;
+ return true;
+ }
+
+ private static string Normalize(string path)
+ {
+ return path?.Replace('\\', '/').TrimEnd('/') ?? string.Empty;
+ }
+
+ private static string ParseSuggestedValue(string output)
+ {
+ if (string.IsNullOrEmpty(output))
+ return string.Empty;
+
+ var match = REG_SAFE_DIRECTORY_HINT().Match(output);
+ if (!match.Success)
+ return string.Empty;
+
+ return Dequote(match.Groups["value"].Value.Trim());
+ }
+
+ ///
+ /// Git quotes the suggested value with `sq_quote_buf()`, which escapes `'` and `!` as `'\''` and
+ /// `'\!'`. Decodes it back to the plain path (see `quote.c` of git).
+ ///
+ private static string Dequote(string value)
+ {
+ if (value.Length > 1 && value[0] == '\'')
+ {
+ var builder = new StringBuilder(value.Length);
+ for (var i = 1; i < value.Length; i++)
+ {
+ var c = value[i];
+ if (c != '\'')
+ {
+ builder.Append(c);
+ continue;
+ }
+
+ if (i == value.Length - 1)
+ return builder.ToString();
+
+ if (i + 3 < value.Length && value[i + 1] == '\\' && (value[i + 2] == '\'' || value[i + 2] == '!') && value[i + 3] == '\'')
+ {
+ builder.Append(value[i + 2]);
+ i += 3;
+ continue;
+ }
+
+ return string.Empty;
+ }
+
+ return string.Empty;
+ }
+
+ if (value.Length > 1 && value[0] == '"' && value[^1] == '"')
+ return value[1..^1];
+
+ return value;
+ }
+
+ [GeneratedRegex(@"--add\s+safe\.directory\s+(?[^\r\n]+)", RegexOptions.Multiline)]
+ private static partial Regex REG_SAFE_DIRECTORY_HINT();
+ }
+}
diff --git a/src/Models/Watcher.cs b/src/Models/Watcher.cs
index ce18fe4be2..66e246bc07 100644
--- a/src/Models/Watcher.cs
+++ b/src/Models/Watcher.cs
@@ -43,6 +43,7 @@ public Watcher(IRepository repo, string fullpath, string gitDir)
combined.Renamed += OnRepositoryChanged;
combined.Changed += OnRepositoryChanged;
combined.Deleted += OnRepositoryChanged;
+ combined.Error += OnWatcherError;
combined.EnableRaisingEvents = false;
_watchers.Add(combined);
@@ -58,6 +59,7 @@ public Watcher(IRepository repo, string fullpath, string gitDir)
wc.Renamed += OnWorkingCopyChanged;
wc.Changed += OnWorkingCopyChanged;
wc.Deleted += OnWorkingCopyChanged;
+ wc.Error += OnWatcherError;
wc.EnableRaisingEvents = false;
var git = new FileSystemWatcher();
@@ -69,6 +71,7 @@ public Watcher(IRepository repo, string fullpath, string gitDir)
git.Renamed += OnGitDirChanged;
git.Changed += OnGitDirChanged;
git.Deleted += OnGitDirChanged;
+ git.Error += OnWatcherError;
git.EnableRaisingEvents = false;
_watchers.Add(wc);
@@ -240,6 +243,21 @@ private void OnRepositoryChanged(object o, FileSystemEventArgs e)
HandleWorkingCopyFileChanged(name, e.FullPath);
}
+ ///
+ /// The internal buffer overflowed (a large fetch or checkout writes thousands of files), so
+ /// some events were dropped and we cannot know which. Reload everything once things settle.
+ ///
+ private void OnWatcherError(object o, ErrorEventArgs e)
+ {
+ var desired = DateTime.Now.AddSeconds(1).ToFileTime();
+ Interlocked.Exchange(ref _updateBranch, desired);
+ Interlocked.Exchange(ref _updateTags, desired);
+ Interlocked.Exchange(ref _updateStashes, desired);
+ Interlocked.Exchange(ref _updateWC, desired);
+ if (_repo.MayHaveSubmodules())
+ Interlocked.Exchange(ref _updateSubmodules, desired);
+ }
+
private void OnGitDirChanged(object o, FileSystemEventArgs e)
{
if (string.IsNullOrEmpty(e.Name))
@@ -290,7 +308,7 @@ private void HandleGitDirFileChanged(string name)
{
Interlocked.Exchange(ref _updateTags, DateTime.Now.AddSeconds(.5).ToFileTime());
}
- else if (name.StartsWith("refs/stash", StringComparison.Ordinal))
+ else if (name.StartsWith("refs/stash", StringComparison.Ordinal) || name.Equals("logs/refs/stash", StringComparison.Ordinal))
{
Interlocked.Exchange(ref _updateStashes, DateTime.Now.AddSeconds(.5).ToFileTime());
}
@@ -302,6 +320,12 @@ private void HandleGitDirFileChanged(string name)
{
Interlocked.Exchange(ref _updateBranch, DateTime.Now.AddSeconds(.5).ToFileTime());
}
+ else if (name.Equals("packed-refs", StringComparison.Ordinal))
+ {
+ var desired = DateTime.Now.AddSeconds(.5).ToFileTime();
+ Interlocked.Exchange(ref _updateBranch, desired);
+ Interlocked.Exchange(ref _updateTags, desired);
+ }
else if (name.StartsWith("reftable/", StringComparison.Ordinal))
{
var desired = DateTime.Now.AddSeconds(.5).ToFileTime();
diff --git a/src/Resources/Locales/de_DE.axaml b/src/Resources/Locales/de_DE.axaml
index fee376aad9..9e2d348bc8 100644
--- a/src/Resources/Locales/de_DE.axaml
+++ b/src/Resources/Locales/de_DE.axaml
@@ -16,11 +16,6 @@
Pfad für diesen Worktree. Relative Pfade werden unterstützt.
Branch-Name:
Optional. Standard ist der Name des Zielordners.
- Branch verfolgen:
- Remote-Branch verfolgen
- Was auschecken:
- Neuen Branch erstellen
- Existierender Branch
AI-Assistent
Modell
NEU GENERIEREN
@@ -201,7 +196,6 @@
SHA
Unterzeichner:
Im Browser öffnen
- SPALTE
Commit-Nachricht eingeben. Leerzeile zum Trennen von Betreff und Beschreibung verwenden!
BETREFF
Vergleichen
diff --git a/src/Resources/Locales/el_GR.axaml b/src/Resources/Locales/el_GR.axaml
index 6c6996121a..8e5e5f4dfe 100644
--- a/src/Resources/Locales/el_GR.axaml
+++ b/src/Resources/Locales/el_GR.axaml
@@ -16,11 +16,6 @@
Διαδρομή για αυτό το worktree. Υποστηρίζεται σχετική διαδρομή.
Όνομα κλάδου:
Προαιρετικό. Προεπιλογή είναι το όνομα του φακέλου προορισμού.
- Παρακολούθηση κλάδου:
- Παρακολούθηση απομακρυσμένου κλάδου
- Τι να γίνει checkout:
- Δημιουργία νέου κλάδου
- Υπάρχων κλάδος
Βοηθός AI
ΜΟΝΤΕΛΟ
ΕΠΑΝΑΔΗΜΙΟΥΡΓΙΑ
@@ -201,7 +196,6 @@
SHA
Υπογράφων:
Άνοιγμα στον περιηγητή
- ΣΤΗΛΗ
Εισαγάγετε το μήνυμα commit. Χρησιμοποιήστε μια κενή γραμμή για να διαχωρίσετε το θέμα από την περιγραφή!
ΘΕΜΑ
Σύγκριση
diff --git a/src/Resources/Locales/en_US.axaml b/src/Resources/Locales/en_US.axaml
index eb8ff1ca7e..76ac9e4dcb 100644
--- a/src/Resources/Locales/en_US.axaml
+++ b/src/Resources/Locales/en_US.axaml
@@ -12,11 +12,6 @@
Path for this worktree. Relative path is supported.
Branch Name:
Optional. Default is the destination folder name.
- Track Branch:
- Tracking remote branch
- What to Checkout:
- Create New Branch
- Existing Branch
AI Assistant
MODEL
RE-GENERATE
@@ -63,6 +58,7 @@
Holding Ctrl (on Windows/Linux) or ⌘ (on macOS) when clicking commit SHA will rebuild blame data based on that revision.
BLAME ON THIS FILE IS NOT SUPPORTED!!!
Checkout ${0}$...
+ Checkout ${0}$ as worktree...
Compare selected 2 branches
Compare with...
Compare with HEAD
@@ -119,6 +115,14 @@
The following submodules need to be updated:{0}Do you want to update them?
Checkout & Fast-Forward
Fast-Forward to:
+ Checkout Branch as Worktree
+ Local Branch:
+ New Branch Name:
+ Optional. Default is the destination folder name.
+ Remote Branch:
+ Tracking this remote branch.
+ Worktree Path:
+ Path for this worktree. Relative path is supported.
Checkout Branch From Stash
New Branch:
Stash:
@@ -200,7 +204,6 @@
SHA
Signer:
Open in Browser
- COL
Enter commit message. Please use an empty-line to separate subject and description!
SUBJECT
Compare
@@ -947,10 +950,15 @@
CHANGES
STASHES
Statistics
+ COMMITS
OVERVIEW
MONTH
WEEK
SourceGit will only get a maximum of 200,000 commits according to the target branch for analysis.
+ TOP AUTHORS
+ COMMITS
+ PERCENTAGE
+ Authors with less than 1% commits will be grouped under Others.
AUTHORS:
COMMITS:
SUBMODULES
@@ -994,6 +1002,11 @@
Merge ${0}$ into ${1}$...
Push ${0}$...
TERMINATE
+ Untrusted Repository
+ Do you want to run `git config --global --add safe.directory {0}` command to trust this path?
+ Git refused to access this repository:
+ Path:
+ {0} repositories were skipped because git does not trust them. Please open them manually and confirm whether to trust them.
Update Submodules
All submodules
Initialize as needed
diff --git a/src/Resources/Locales/es_ES.axaml b/src/Resources/Locales/es_ES.axaml
index 856153ea2f..e5a8c77e75 100644
--- a/src/Resources/Locales/es_ES.axaml
+++ b/src/Resources/Locales/es_ES.axaml
@@ -11,16 +11,11 @@
Agregar Archivo(s) Para Ignorar
Patrón:
Almacenar Archivo:
- Agregar Worktree
+ Agregar Árbol de trabajo
Ubicación:
- Ruta para este worktree. Se admite ruta relativa.
+ Ruta para este árbol de trabajo. Se admite ruta relativa.
Nombre de la Rama:
Opcional. Por defecto es el nombre de la carpeta de destino.
- Rama de Seguimiento:
- Seguimiento de rama remota
- Qué Checkout:
- Crear Nueva Rama
- Rama Existente
Asistente OpenAI
Modelo
RE-GENERAR
@@ -66,7 +61,8 @@
Ignorar cambios de espacios en blanco
Mantener presionado Ctrl (en Windows/Linux) o ⌘ (en macOS) cuando se hace click en el SHA del commit reconstruirá lo datos del blame basados en esa revisión.
¡BLAME EN ESTE ARCHIVO NO SOPORTADO!
- Checkout ${0}$...
+ Checkout a ${0}$...
+ Checkout a ${0}$ como árbol de trabajo...
Comparar las 2 ramas seleccionadas
Comparar con...
Comparar con HEAD
@@ -90,7 +86,7 @@
Rebase ${0}$ en ${1}$...
Renombrar ${0}$...
Resetear ${0}$ a ${1}$...
- Cambiar a ${0}$ (worktree)
+ Cambiar a ${0}$ (árbol de trabajo)
Establecer Rama de Seguimiento...
{0} commit(s) adelante
{0} commit(s) adelante, {1} commit(s) detrás
@@ -101,7 +97,7 @@
ESTADO
SEGUIMIENTO
URL
- WORKTREE
+ ÁRBOL DE TRABAJO
CANCELAR
Resetear a Revisión Padre
Resetear a Esta Revisión
@@ -123,6 +119,14 @@
Los siguientes submódulos necesitan ser actualizados:{0} ¿Quieres actualizarlos?
Checkout y Fast-Forward
Fast-Forward a:
+ Checkout a Rama como Árbol de trabajo
+ Rama Local:
+ Nombre de la Nueva Rama:
+ Opcional. Por defecto es el nombre de la carpeta de destino.
+ Rama Remota:
+ Rastrear esta rama remota.
+ Ruta del Árbol de trabajo:
+ Ruta para este árbol de trabajo. Se puede usar una ruta relativa.
Checkout a la Rama desde el Stash
Nueva Rama:
Stash:
@@ -157,7 +161,7 @@
Cherry-Pick Este Commit
Cherry-Pick ...
Comparar con HEAD
- Comparar con Worktree
+ Comparar con Árbol de trabajo
Autor
Fecha/Hora del Autor
Mensaje
@@ -187,6 +191,7 @@
Archivo LFS
Buscar Archivos...
Submódulo
+ SELECCIONAR ARCHIVO PARA VER SU CONTENIDO
INFORMACIÓN
AUTOR
COMMITTER
@@ -203,7 +208,6 @@
SHA
Firmante:
Abrir en Navegador
- COL
Ingresa el mensaje de commit. ¡Por favor usa una línea en blanco para separar el título y la descripción!
ASUNTO
Comparar
@@ -738,8 +742,8 @@
Shell/Terminal
Podar Remoto
Destino:
- Podar Worktrees
- Podar información de worktree en `$GIT_COMMON_DIR/worktrees`
+ Podar Árboles de trabajo
+ Podar información del árbol de trabajo en `$GIT_COMMON_DIR/worktrees`
Pull
Rama Remota:
En:
@@ -791,7 +795,7 @@
Abrir En Navegador
Podar (Prune)
Establecer Push URL...
- Confirmar para Eliminar Worktree
+ Confirmar para Eliminar Árbol de trabajo
Utilizar Opción `--force`
Destino:
Renombrar Rama
@@ -865,8 +869,8 @@
Abrir en Terminal
Ver Logs
Visitar '{0}' en el Navegador
- WORKTREES
- AÑADIR WORKTREE
+ ÁRBOLES DE TRABAJO
+ AÑADIR ÁRBOL DE TRABAJO
PRUNE
URL del Repositorio Git
Resetear Rama Actual a Revisión
@@ -950,10 +954,15 @@
CAMBIOS
STASHES
Estadísticas
+ COMMITS
GENERAL
MES
SEMANA
SourceGit solamente obtendrá un máximo de 200,000 commits de acuerdo a la rama destino para su análisis.
+ AUTORES DESTACADOS
+ COMMITS
+ PORCENTAJE
+ Autores con menos del 1% de commits serán agrupados bajo Otros.
AUTORES:
COMMITS:
SUBMÓDULOS
@@ -997,6 +1006,11 @@
Hacer merge de ${0}$ a ${1}$...
Hacer push a ${0}$...
FINALIZAR
+ Repositorio No confiable
+ ¿Quieres correr el comando `git config --global --add safe.directory {0}` para confiar en está ruta?
+ Git rechazó el acceso a este repositorio:
+ Ruta:
+ {0} repositorios fueron omitidos porque git no confía en ellos. Ábrelos manualmente por favor y confirma si confías en ellos.
Actualizar Submódulos
Todos los submódulos
Inicializar según sea necesario
@@ -1033,6 +1047,7 @@
Puedes hacer stage a este archivo ahora.
Limpiar Historial
¿Estás seguro de querer limpiar todo el historial de los mensajes de commit? Esta acción no se puede deshacer.
+ Ocultar Barra lateral
COMMIT
COMMIT y PUSH
Plantilla/Historias
@@ -1049,6 +1064,7 @@
USAR MÍOS
USAR SUYOS
DESCARTAR TODO
+ Mostrar Barra lateral
Cambios de Filtro...
INCLUIR ARCHIVOS SIN RASTREAR
NO HAY MENSAJES DE ENTRADA RECIENTES
@@ -1066,7 +1082,7 @@
Plantilla: ${0}$
ESPACIO DE TRABAJO:
Configura Espacios de Trabajo...
- WORKTREE
+ ÁRBOL DE TRABAJO
RAMA
Copiar Ruta
HEAD
diff --git a/src/Resources/Locales/fr_FR.axaml b/src/Resources/Locales/fr_FR.axaml
index 823b851bae..e6b46a1e27 100644
--- a/src/Resources/Locales/fr_FR.axaml
+++ b/src/Resources/Locales/fr_FR.axaml
@@ -16,11 +16,6 @@
Chemin vers ce worktree. Relatif supporté.
Nom de branche:
Optionnel. Nom du dossier de destination par défaut.
- Suivre la branche :
- Suivi de la branche distante
- Que récupérer :
- Créer une nouvelle branche
- Branche existante
Assistant IA
Modèle
RE-GÉNÉRER
@@ -191,7 +186,6 @@
SHA
Signataire :
Ouvrir dans le navigateur
- COL
Saisissez le message de commit. Utilisez une ligne vide pour séparer le sujet et la description !
SUJET
Comparer
diff --git a/src/Resources/Locales/he_IL.axaml b/src/Resources/Locales/he_IL.axaml
index 2ba8cc88c1..98426b3023 100644
--- a/src/Resources/Locales/he_IL.axaml
+++ b/src/Resources/Locales/he_IL.axaml
@@ -16,11 +16,6 @@
נתיב ל־worktree זה. נתיב יחסי נתמך.
שם Branch:
לא חובה. ברירת המחדל היא שם תיקיית היעד.
- Branch למעקב:
- מעקב אחר branch מרוחק
- מה לבצע לו checkout:
- צור Branch חדש
- Branch קיים
עוזר AI
מודל
צור מחדש
@@ -191,7 +186,6 @@
SHA
חותם:
פתח בדפדפן
- עמודה
הזן הודעת commit. יש להפריד בין subject לתיאור באמצעות שורה ריקה!
SUBJECT
השווה
diff --git a/src/Resources/Locales/id_ID.axaml b/src/Resources/Locales/id_ID.axaml
index 0ff7f394c4..a50be71a66 100644
--- a/src/Resources/Locales/id_ID.axaml
+++ b/src/Resources/Locales/id_ID.axaml
@@ -16,11 +16,6 @@
Jalur untuk worktree ini. Jalur relatif didukung.
Nama Branch:
Opsional. Standar adalah nama folder tujuan.
- Track Branch:
- Track remote branch
- Yang Akan Di-Checkout:
- Buat Branch Baru
- Branch Yang Ada
Asisten AI
Model
BUAT ULANG
@@ -201,7 +196,6 @@
SHA
Penanda Tangan:
Buka di Browser
- KOL
Masukkan pesan commit. Gunakan baris kosong untuk memisahkan subjek dan deskripsi!
SUBJEK
Perbandingan
diff --git a/src/Resources/Locales/it_IT.axaml b/src/Resources/Locales/it_IT.axaml
index e595a13df9..3ce0bae2c9 100644
--- a/src/Resources/Locales/it_IT.axaml
+++ b/src/Resources/Locales/it_IT.axaml
@@ -16,11 +16,6 @@
Percorso per questo worktree. Supportato il percorso relativo.
Nome Branch:
Facoltativo. Predefinito è il nome della cartella di destinazione.
- Traccia Branch:
- Traccia branch remoto
- Di cosa fare il checkout:
- Crea nuovo branch
- Branch esistente
Assistente AI
Modello
RIGENERA
diff --git a/src/Resources/Locales/ja_JP.axaml b/src/Resources/Locales/ja_JP.axaml
index ec73701055..ac9637eea9 100644
--- a/src/Resources/Locales/ja_JP.axaml
+++ b/src/Resources/Locales/ja_JP.axaml
@@ -16,11 +16,6 @@
この作業ツリーへのパス (相対パスも使用できます)
ブランチの名前:
省略可能 - 既定では宛先のフォルダーと同じ名前が使用されます
- 追跡するブランチ:
- 追跡するリモートブランチを設定
- チェックアウトする内容:
- 新しいブランチを作成
- 既存のブランチ
AI アシスタント
モデル
再生成
@@ -203,7 +198,6 @@
SHA
署名者:
ブラウザーで開く
- 列
コミットメッセージを入力してください。タイトルと説明は、空行で分けて記述してください!
タイトル
比較
diff --git a/src/Resources/Locales/ko_KR.axaml b/src/Resources/Locales/ko_KR.axaml
index 939f8a4c1c..e0695553fb 100644
--- a/src/Resources/Locales/ko_KR.axaml
+++ b/src/Resources/Locales/ko_KR.axaml
@@ -16,11 +16,6 @@
이 워크트리의 경로입니다. 상대 경로를 지원합니다.
브랜치 이름:
선택 사항. 기본값은 대상 폴더 이름입니다.
- 추적할 브랜치:
- 원격 브랜치 추적
- 체크아웃할 대상:
- 새 브랜치 생성
- 기존 브랜치
AI 어시스턴트
모델
재생성
@@ -196,7 +191,6 @@
SHA
서명자:
브라우저에서 열기
- 열
커밋 메시지를 입력하세요. 제목과 설명은 빈 줄로 구분하세요!
제목
비교
diff --git a/src/Resources/Locales/pt_BR.axaml b/src/Resources/Locales/pt_BR.axaml
index 0e1a405bcd..5084f0180b 100644
--- a/src/Resources/Locales/pt_BR.axaml
+++ b/src/Resources/Locales/pt_BR.axaml
@@ -16,11 +16,6 @@
Caminho para este worktree. Caminho relativo é suportado.
Nome do Branch:
Opcional. O padrão é o nome da pasta de destino.
- Rastrear Branch:
- Rastreando branch remoto
- O que Checar:
- Criar Novo Branch
- Branch Existente
Assietente IA
Modelo
Gerar novamente
diff --git a/src/Resources/Locales/ru_RU.axaml b/src/Resources/Locales/ru_RU.axaml
index 7566fe27f4..f9260cc4f9 100644
--- a/src/Resources/Locales/ru_RU.axaml
+++ b/src/Resources/Locales/ru_RU.axaml
@@ -16,11 +16,6 @@
Путь к рабочему каталогу (поддерживается относительный путь)
Имя ветки:
Имя целевого каталога по умолчанию (необязательно)
- Отслеживание ветки:
- Отслеживание внешней ветки
- Переключиться на:
- Создать новую ветку
- Ветку из списка
Помощник OpenAI
Модель
ПЕРЕСОЗДАТЬ
@@ -64,8 +59,10 @@
Расследование
Расследование на предыдущей редакции
Игнорировать изменения пробелов
+ Если при нажатии на ревизию SHA удерживать нажатой Ctrl (на Windows/Linux) или ⌘ (на macOS), данные расследования будут перестроены на основе этой ревизии.
РАССЛЕДОВАНИЕ В ЭТОМ ФАЙЛЕ НЕ ПОДДЕРЖИВАЕТСЯ!!!
Переключиться на ${0}$...
+ Сделать ${0}$ рабочим деревом...
Сравнить две выбранные ветки
Сравнить с ...
Сравнить с ГОЛОВОЙ
@@ -95,6 +92,7 @@
{0} ревизий вперёд, {1} ревизий назад
{0} ревизий назад
Неверно
+ АДРЕС ВЫГРУЗКИ
УДАЛЁННЫЙ
СОСТОЯНИЕ
ОТСЛЕЖИВАНИЕ
@@ -121,6 +119,14 @@
Подмодулям требуется обновление:{0}Обновить их?
Переключиться и перемотать
Перемотать к:
+ Сделать ветку рабочим деревом
+ Локальная ветка:
+ Имя новой ветки:
+ По желанию. Используемое имя целевого каталога по умолчанию.
+ Удалённая ветка:
+ Отслеживать эту удалённую ветку.
+ Путь рабочего дерева:
+ Путь для данного рабочего дерева. Поддерживается относительный путь.
Переключить ветку из отложенного
Новая ветка:
Отложенный:
@@ -185,6 +191,7 @@
Файл LFS
Поиск файлов...
Подмодуль
+ ВЫБЕРИТЕ ФАЙЛ ДЛЯ ПРОСМОТРА СОДЕРЖИМОГО
ИНФОРМАЦИЯ
АВТОР
РЕВИЗОР (ИСПОЛНИТЕЛЬ)
@@ -201,7 +208,6 @@
SHA
Подписант:
Открыть в браузере
- СТБ
Введите сообщение ревизии. Пожалуйста, используйте пустые строки для разделения субъекта и описания!
СУБЪЕКТ
Сравнить
@@ -337,6 +343,7 @@
Простой
Удерживайте Ctrl, чтобы сразу начать
Вырезать
+ Обзор
Отклонить
Ничего не делать
Отложить и применить повторно
@@ -511,6 +518,7 @@
Отслеживать файлы с именем «{0}»
Отслеживать все файлы (*{0})
Выбрать ревизию
+ Расширенные опции
АВТОР
ВРЕМЯ АВТОРА
ВРЕМЯ РЕВИЗИИ
@@ -554,7 +562,10 @@
Загрузить (pull), запускается сразу
Выложить (push), запускается сразу
Принудительно перечитать репозиторий
+ Развернуть/Свернуть панель подробностей ревизии
+ Переключить панель поиска ревизий
Переключить на «Изменения»
+ Переключить на «Обзор»
Переключить на «Отложенные»
Отклонить
Сформировать
@@ -656,9 +667,10 @@
{0} лет назад
Вчера
Параметры
- ОТКРЫТЬ ИИ
+ ИИ
Дополнительная подсказка (Для перечисления ваших требований используйте `-`)
Ключ API
+ Дополнительные заголовки (по одному «Имя: Значение» на строку)
Модель
Автоматическое получение доступных идентификаторов моделей
Имя:
@@ -771,6 +783,7 @@
Редактировать внешний репозиторий
Имя:
Имя внешнего репозитория
+ Установить адрес выгрузки равным адресу этого репозитория
Адрес:
Адрес внешнего репозитория git
Копировать адрес
@@ -781,6 +794,7 @@
Извлечь
Открыть в браузере
Удалить
+ Установить адрес выгрузки...
Подтвердить удаление рабочего каталога
Включить опцию (--force)
Цель:
@@ -834,6 +848,8 @@
Путь
SHA
Текущая ветка
+ ИСКАТЬ В
+ Поиск ревизий
Только оформленные ревизии
Показывать только первый родительский
ПОКАЗЫВАТЬ ФЛАГИ
@@ -884,6 +900,10 @@
Дата выпуска новой версии:
Обновление ПО
Сейчас нет обновлений.
+ Установить адрес выгрузки на удалённый
+ Адрес выгрузки:
+ Удалённый:
+ Адрес:
Установить ветку подмодуля
Подмодуль:
Текущий:
@@ -934,9 +954,15 @@
ИЗМЕНЕНИЯ
ОТЛОЖЕННЫЕ
Статистика
+ РЕВИЗИИ
ОБЗОР
МЕСЯЦ
НЕДЕЛЯ
+ SourceGit проанализирует не более 200 000 ревизий в целевой ветке.
+ ТОП АВТОРОВ
+ РЕВИЗИИ
+ ПРОЦЕНТ
+ Авторы с долей менее 1% ревизий объединены в группу «Другие».
АВТОРЫ:
РЕВИЗИИ:
ПОДМОДУЛИ
@@ -980,6 +1006,11 @@
Влить ${0}$ в ${1}$...
Выложить ${0}$...
ПРЕКРАТИТЬ
+ Недоверенный репозиторий
+ Вы хотите выполнить команду (git config --global --add safe.directory {0}), чтобы разрешить доступ к этому пути?
+ Отказ гита в доступе к этому репозиторию:
+ Путь:
+ Пропущено репозиториев из-за недоверия к ним гитом: {0}. Пожалуйста, откройте их вручную и проверьте, можно ли им доверять.
Обновление подмодулей
Все подмодули
Создавать по необходимости
@@ -1016,6 +1047,7 @@
Теперь вы можете сформировать этот файл.
Очистить историю
Вы действительно хотите очистить всю историю сообщений ревизии? Данное действие нельзя отменить.
+ Скрыть боковую панель
ЗАФИКСИРОВАТЬ
ЗАФИКСИРОВАТЬ и ОТПРАВИТЬ
Шаблон/Истории
@@ -1031,6 +1063,8 @@
КОНФЛИКТЫ ФАЙЛОВ РАЗРЕШЕНЫ
ИСПОЛЬЗОВАТЬ МОИ
ИСПОЛЬЗОВАТЬ ИХ
+ ОТКЛОНИТЬ ВСЕ
+ Показать боковую панель
Фильтр изменений...
ВКЛЮЧИТЬ НЕОТСЛЕЖИВАЕМЫЕ ФАЙЛЫ
НЕТ ПОСЛЕДНИХ ВХОДНЫХ СООБЩЕНИЙ
diff --git a/src/Resources/Locales/ta_IN.axaml b/src/Resources/Locales/ta_IN.axaml
index f2f12bcfee..3473ff1cab 100644
--- a/src/Resources/Locales/ta_IN.axaml
+++ b/src/Resources/Locales/ta_IN.axaml
@@ -11,11 +11,6 @@
இந்த பணிமரத்திற்கான பாதை. தொடர்புடைய பாதை ஆதரிக்கப்படுகிறது.
கிளை பெயர்:
விருப்பத்தேர்வு. இயல்புநிலை இலக்கு கோப்புறை பெயர்.
- கிளை கண்காணி:
- தொலை கிளையைக் கண்காணித்தல்
- என்ன சரிபார்க்க வேண்டும்:
- புதிய கிளையை உருவாக்கு
- ஏற்கனவே உள்ள கிளை
செநு உதவியாளர்
மாதிரி
மறு-உருவாக்கு
diff --git a/src/Resources/Locales/uk_UA.axaml b/src/Resources/Locales/uk_UA.axaml
index a6e5b89ae5..5f44193e39 100644
--- a/src/Resources/Locales/uk_UA.axaml
+++ b/src/Resources/Locales/uk_UA.axaml
@@ -11,11 +11,6 @@
Шлях для цього робочого дерева. Відносний шлях підтримується.
Назва гілки:
Необов'язково. За замовчуванням — назва кінцевої папки.
- Відстежувати гілку:
- Відстежувати віддалену гілку
- Що перемкнути:
- Створити нову гілку
- Наявна гілка
AI Асистент
Модель
ПЕРЕГЕНЕРУВАТИ
diff --git a/src/Resources/Locales/zh_CN.axaml b/src/Resources/Locales/zh_CN.axaml
index 761cc724a2..d24f14b1e8 100644
--- a/src/Resources/Locales/zh_CN.axaml
+++ b/src/Resources/Locales/zh_CN.axaml
@@ -16,11 +16,6 @@
填写该工作树的路径。支持相对路径。
分支名 :
选填。默认使用目标文件夹名称。
- 跟踪分支
- 设置上游跟踪分支
- 检出分支方式 :
- 创建新分支
- 已有分支
AI助手
模型
重新生成
@@ -67,6 +62,7 @@
按住 Ctrl (Windows及Linux平台) 或 ⌘ (macOS平台) 键并点击提交哈希将基于所选的提交重新计算逐行追溯
选中文件不支持该操作!!!
检出(checkout) ${0}$...
+ 检出 ${0}$ 为新工作树...
比较选中的 2 个分支
与其他分支或标签比较...
与当前 HEAD 比较
@@ -123,6 +119,14 @@
以下子模块需要更新:{0}是否立即更新?
检出分支并快进
上游分支 :
+ 检出分支为新的工作树
+ 本地分支 :
+ 新分支名称 :
+ 选填。默认使用目标文件夹名称。
+ 远程分支 :
+ 新分支跟踪此远程分支
+ 工作树路径 :
+ 必填。可填写相对路径。
从所选贮藏检出分支
新分支 :
所选贮藏 :
@@ -204,7 +208,6 @@
提交指纹
签名者 :
浏览器中查看
- 列
请输入提交的信息。注意:主题与具体描述中间需要空白行分隔!
主题
比较
@@ -951,10 +954,15 @@
查看变更
贮藏列表
提交统计
+ 提交统计图
总览
本月
本周
SourceGit 仅会按所选分支最多取出 200000 条提交记录进行分析
+ 主要贡献者
+ 提交数量
+ 百分比
+ 提交占比小于1%的作者会被统计入Others分组
贡献者人数:
提交次数:
子模块
@@ -998,6 +1006,11 @@
合并 ${0}$ 到 ${1}$...
推送 ${0}$...
终止运行
+ 不受信任的仓库
+ 是否执行 `git config --global --add safe.directory {0}` 命令以信任该仓库?
+ Git 拒绝访问该仓库:
+ 路径 :
+ 有 {0} 个仓库因 git 的信任检查被跳过,请手动打开它们并确认是否信任。
更新子模块
更新所有子模块
如未初始化子模块,先初始化
diff --git a/src/Resources/Locales/zh_TW.axaml b/src/Resources/Locales/zh_TW.axaml
index 135596f6e9..97680c6103 100644
--- a/src/Resources/Locales/zh_TW.axaml
+++ b/src/Resources/Locales/zh_TW.axaml
@@ -16,11 +16,6 @@
填寫該工作樹的路徑。支援相對路徑。
分支名稱:
選填。預設使用目標資料夾名稱。
- 追蹤分支
- 設定遠端追蹤分支
- 簽出分支方式:
- 建立新分支
- 已有分支
AI 助理
模型
重新產生
@@ -67,6 +62,7 @@
按住 Ctrl 鍵 (Windows/Linux) 或 ⌘ 鍵 (macOS) 並點擊提交編號,將依據該次提交重新執行逐行溯源
所選擇的檔案不支援該操作!
簽出 (checkout) ${0}$...
+ 簽出 (checkout) ${0}$ 為工作樹...
比較所選的 2 個分支
與其他分支或標籤比較...
與目前 HEAD 比較
@@ -123,6 +119,14 @@
以下子模組需要更新: {0},您要立即更新嗎?
簽出分支並快轉
上游分支:
+ 簽出分支為工作樹
+ 本機分支:
+ 新分支名稱:
+ 選填。預設使用目標資料夾名稱。
+ 遠端分支:
+ 追蹤此遠端分支
+ 工作樹路徑:
+ 填寫該工作樹的路徑。支援相對路徑。
從所選擱置簽出分支
新分支:
所選擱置:
@@ -181,12 +185,13 @@
另存為修補檔 (patch)...
變更對比
個檔案已變更
- 搜尋變更...
+ 篩選變更...
收合詳細面板
檔案列表
LFS 檔案
搜尋檔案...
子模組
+ 請選擇要檢視內容的檔案
基本資訊
作者
提交者
@@ -203,7 +208,6 @@
提交編號
簽署人:
在瀏覽器中檢視
- 欄
請輸入提交訊息,標題與詳細描述之間請使用單行空白區隔。
標題
比較
@@ -370,7 +374,7 @@
標籤名稱:
同時刪除遠端存放庫中的此標籤
二進位檔案
- 查看新內容
+ 檢視新內容
空檔案
第一個差異
忽略空白符號變化
@@ -813,7 +817,7 @@
沒有自訂的動作
捨棄所有變更
在檔案瀏覽器中開啟
- 快速搜尋分支/標籤/子模組
+ 篩選分支/標籤/子模組
篩選以顯示或隱藏
摺疊篩選器
取消指定
@@ -950,10 +954,15 @@
檢視變更
擱置變更列表
提交統計
+ 提交統計圖
總覽
本月
本週
SourceGit 僅會依所選分支取出最多 200,000 筆提交記錄進行分析
+ 主要貢獻者
+ 提交次數
+ 百分比
+ 提交佔比低於 1% 的貢獻者會被歸入 Others 分組
貢獻者人數:
提交次數:
子模組
@@ -997,6 +1006,11 @@
合併 ${0}$ 到 ${1}$...
推送 ${0}$...
終止執行
+ 不受信任的存放庫
+ 您是否要執行 `git config --global --add safe.directory {0}` 命令以信任該存放庫?
+ Git 拒絕存取該存放庫:
+ 路徑:
+ 有 {0} 個存放庫因 git 的信任檢查而被略過,請手動開啟並確認是否信任。
更新子模組
更新所有子模組
如果子模組尚未初始化,則將其初始化
@@ -1021,7 +1035,7 @@
開啟本機存放庫
開啟終端機
重新掃描預設複製 (clone) 目錄下的存放庫
- 快速搜尋存放庫...
+ 篩選存放庫...
本機變更
加入至 .gitignore 忽略清單
忽略所有 *{0} 檔案
@@ -1033,6 +1047,7 @@
現在您已可將其加入暫存區中
清除提交訊息記錄
您確定要清除所有提交訊息記錄嗎 (執行後無法復原)?
+ 收合側邊欄
提 交
提交並推送
提交訊息記錄/範本
@@ -1049,7 +1064,8 @@
使用我方版本 (ours)
使用對方版本 (theirs)
捨棄所有變更
- 搜尋變更...
+ 展開側邊欄
+ 篩選變更...
顯示未追蹤檔案
沒有提交訊息記錄
沒有可套用的提交訊息範本
diff --git a/src/Resources/Styles.axaml b/src/Resources/Styles.axaml
index 2a605b2bd6..d1ba76c821 100644
--- a/src/Resources/Styles.axaml
+++ b/src/Resources/Styles.axaml
@@ -21,6 +21,8 @@
+
+
@@ -174,9 +176,9 @@
-
+
+
-
+ IsVisible="{Binding !IsWorkingCopyVisible}"/>
-
@@ -684,14 +696,10 @@
-
-
-
-
-
-
-
-
+
+ CanResize="True">
@@ -134,7 +136,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
diff --git a/src/Views/TrustRepository.axaml b/src/Views/TrustRepository.axaml
new file mode 100644
index 0000000000..a78e1a49e0
--- /dev/null
+++ b/src/Views/TrustRepository.axaml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Views/TrustRepository.axaml.cs b/src/Views/TrustRepository.axaml.cs
new file mode 100644
index 0000000000..5f624bc238
--- /dev/null
+++ b/src/Views/TrustRepository.axaml.cs
@@ -0,0 +1,12 @@
+using Avalonia.Controls;
+
+namespace SourceGit.Views
+{
+ public partial class TrustRepository : UserControl
+ {
+ public TrustRepository()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/src/Views/Welcome.axaml.cs b/src/Views/Welcome.axaml.cs
index c93c27ebb8..65538875d6 100644
--- a/src/Views/Welcome.axaml.cs
+++ b/src/Views/Welcome.axaml.cs
@@ -335,10 +335,32 @@ private async void DropOnTreeView(object sender, DragEventArgs e)
foreach (var item in items)
{
- var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath);
- if (!string.IsNullOrEmpty(path))
+ var root = item.Path.LocalPath;
+ if (!Directory.Exists(root))
{
- await ViewModels.Welcome.Instance.AddRepositoryAsync(path, null, true, false);
+ if (File.Exists(root))
+ root = Path.GetDirectoryName(root);
+ else
+ continue;
+ }
+
+ var rs = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(root);
+ if (!rs.IsSuccess)
+ {
+ if (Models.SafeDirectories.IsUntrustedRepository(rs.StdErr) &&
+ Models.SafeDirectories.TryGetSafeDirectoryValue(root, rs.StdErr, out var safeDirectory))
+ {
+ var pageView = this.FindAncestorOfType();
+ if (pageView is { DataContext: ViewModels.LauncherPage page })
+ {
+ page.Popup = new ViewModels.TrustRepository(page.Node.Id, root, rs.StdErr, safeDirectory, null, false, false, 0);
+ break; // Stop processing further because `SourceGit` only supports processing one popup at a time.
+ }
+ }
+ }
+ else
+ {
+ await ViewModels.Welcome.Instance.AddRepositoryAsync(rs.StdOut.Trim(), null, true, false);
refresh = true;
}
}
@@ -394,10 +416,32 @@ private async void DropOnTreeNode(object sender, DragEventArgs e)
foreach (var item in items)
{
- var path = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(item.Path.LocalPath);
- if (!string.IsNullOrEmpty(path))
+ var root = item.Path.LocalPath;
+ if (!Directory.Exists(root))
+ {
+ if (File.Exists(root))
+ root = Path.GetDirectoryName(root);
+ else
+ continue;
+ }
+
+ var rs = await ViewModels.Welcome.Instance.GetRepositoryRootAsync(root);
+ if (!rs.IsSuccess)
+ {
+ if (Models.SafeDirectories.IsUntrustedRepository(rs.StdErr) &&
+ Models.SafeDirectories.TryGetSafeDirectoryValue(root, rs.StdErr, out var safeDirectory))
+ {
+ var pageView = this.FindAncestorOfType();
+ if (pageView is { DataContext: ViewModels.LauncherPage page })
+ {
+ page.Popup = new ViewModels.TrustRepository(page.Node.Id, root, rs.StdErr, safeDirectory, to, false, false, 0);
+ break; // Stop processing further because `SourceGit` only supports processing one popup at a time.
+ }
+ }
+ }
+ else
{
- await ViewModels.Welcome.Instance.AddRepositoryAsync(path, to, true, false);
+ await ViewModels.Welcome.Instance.AddRepositoryAsync(rs.StdOut.Trim(), to, true, false);
refresh = true;
}
}