diff --git a/src/Commands/Pull.cs b/src/Commands/Pull.cs
index 99eaa86b..29d45322 100644
--- a/src/Commands/Pull.cs
+++ b/src/Commands/Pull.cs
@@ -28,7 +28,7 @@ namespace SourceGit.Commands {
if (needStash) {
var changes = new LocalChanges(Cwd).Result();
if (changes.Count > 0) {
- if (!new Stash(Cwd).Push(null, "PULL_AUTO_STASH", true)) {
+ if (!new Stash(Cwd).Push(changes, "PULL_AUTO_STASH")) {
return false;
}
} else {
diff --git a/src/Commands/Stash.cs b/src/Commands/Stash.cs
index 02d46342..68d63488 100644
--- a/src/Commands/Stash.cs
+++ b/src/Commands/Stash.cs
@@ -1,5 +1,5 @@
using System.Collections.Generic;
-using System.Text;
+using System.IO;
namespace SourceGit.Commands {
///
@@ -11,25 +11,37 @@ namespace SourceGit.Commands {
Cwd = repo;
}
- public bool Push(List files, string message, bool includeUntracked) {
- StringBuilder builder = new StringBuilder();
- builder.Append("stash push ");
- if (includeUntracked) builder.Append("-u ");
- builder.Append("-m \"");
- builder.Append(message);
- builder.Append("\" ");
+ public bool Push(List changes, string message) {
+ var temp = Path.GetTempFileName();
+ var stream = new FileStream(temp, FileMode.Create);
+ var writer = new StreamWriter(stream);
- if (files != null && files.Count > 0) {
- builder.Append("--");
- foreach (var f in files) {
- builder.Append(" \"");
- builder.Append(f);
- builder.Append("\"");
+ var needAdd = new List();
+ foreach (var c in changes) {
+ writer.WriteLine(c.Path);
+
+ if (c.WorkTree == Models.Change.Status.Added || c.WorkTree == Models.Change.Status.Untracked) {
+ needAdd.Add(c.Path);
+ if (needAdd.Count > 10) {
+ new Add(Cwd, needAdd).Exec();
+ needAdd.Clear();
+ }
}
}
+ if (needAdd.Count > 0) {
+ new Add(Cwd, needAdd).Exec();
+ needAdd.Clear();
+ }
- Args = builder.ToString();
- return Exec();
+ writer.Flush();
+ stream.Flush();
+ writer.Close();
+ stream.Close();
+
+ Args = $"stash push -m \"{message}\" --pathspec-from-file=\"{temp}\"";
+ var succ = Exec();
+ File.Delete(temp);
+ return succ;
}
public bool Apply(string name) {
diff --git a/src/Resources/Locales/en_US.xaml b/src/Resources/Locales/en_US.xaml
index 19b9cdb0..7c85f5dc 100644
--- a/src/Resources/Locales/en_US.xaml
+++ b/src/Resources/Locales/en_US.xaml
@@ -379,7 +379,6 @@
Stashes
STASHES
CHANGES
- Untracked files not shown
COMMIT : {0} -> {1}
diff --git a/src/Resources/Locales/zh_CN.xaml b/src/Resources/Locales/zh_CN.xaml
index 11129439..538cdddf 100644
--- a/src/Resources/Locales/zh_CN.xaml
+++ b/src/Resources/Locales/zh_CN.xaml
@@ -57,7 +57,7 @@
提交ID :
提交变化
- 克隆远程仓库
+ 克隆远程仓库
远程仓库 :
远程仓库地址
父级目录 :
@@ -69,7 +69,7 @@
额外参数 :
其他克隆参数,选填
- 基本信息
+ 基本信息
修改者
提交者
提交指纹
@@ -87,7 +87,7 @@
邮箱 :
邮箱地址
- 新建分支
+ 新建分支
创建本地分支
新分支基于 :
新分支名 :
@@ -97,14 +97,14 @@
忽略
完成后切换到新分支
- 新建标签
+ 新建标签
标签位于 :
标签名 :
推荐格式 :v1.0.0-alpha
标签描述 :
选填
- 浏览
+ 浏览
在文件浏览器中打开
终端
打开GIT终端
@@ -125,7 +125,7 @@
下一步
终止冲突解决
- GIT工作流
+ GIT工作流
初始化GIT工作流
发布分支 :
开发分支 :
@@ -150,7 +150,7 @@
{0}分支名包含非法字符!
{0}前缀未填写!
{0}前缀包含非法字符!
- 开发分支与发布分支不可相同!
+ 开发分支与发布分支不可相同!
刷新
书签
@@ -158,7 +158,7 @@
打开
在浏览器中查看
- 推送 '{0}'
+ 推送 '{0}'
放弃所有更改
快进到 '{0}'
拉回 '{0}'
@@ -172,12 +172,12 @@
切换上游分支...
复制分支名
- 拉取 '{0}' 更新
+ 拉取 '{0}' 更新
编辑 '{0}'
删除 '{0}'
复制远程地址
- 重置 '{0}' 到此处
+ 重置 '{0}' 到此处
从此处开始对 '{0}' 交互式变基
变基 '{0}' 到此处
挑选此提交
@@ -186,15 +186,15 @@
复制提交指纹
复制提交信息
- 推送 '{0}'
+ 推送 '{0}'
删除 '{0}'
复制标签名
- 应用
+ 应用
应用并删除
删除
- 从暂存中移除
+ 从暂存中移除
暂存...
放弃更改...
贮藏...
@@ -204,20 +204,20 @@
贮藏选中的 {0} 个文件...
另存为补丁...
- 确定要删除此分支吗?
+ 确定要删除此分支吗?
分支名 :
确定要移除该远程吗?
远程名 :
- 确定要移除该标签吗?
+ 确定要移除该标签吗?
标签名 :
同时删除远程仓库中的此标签
- 确定要移除该子模块吗?
+ 确定要移除该子模块吗?
子模块路径 :
- 下一个差异
+ 下一个差异
上一个差异
切换显示模式
请选择需要对比的文件
@@ -228,14 +228,14 @@
LFS对象变更
复制
- 放弃更改确认
+ 放弃更改确认
需要放弃的变更 :
本操作不支持回退,请确认后继续!!!
所有本地址未提交的修改
总计{0}项选中更改
- 拉取
- 拉取远程仓库内容
+ 拉取
+ 拉取远程仓库内容
远程仓库 :
拉取所有的远程仓库
自动清理远程已删除分支
@@ -247,11 +247,11 @@
列表模式
树形模式
- 选择目录...
+ 选择目录...
当前选择 :
历史记录
- 查询提交指纹、信息、作者。回车键开始,ESC键取消
+ 查询提交指纹、信息、作者。回车键开始,ESC键取消
清空
切换横向/纵向显示
已选中{0}项提交
@@ -261,18 +261,18 @@
3. 多选时,仅统计选中行数
4. 右键用于操作选中的某个提交
- 初始化新仓库
+ 初始化新仓库
路径 :
点击【确定】将在此目录执行`git init`操作
- 交互式变基
+ 交互式变基
操作分支 :
开始提交 :
开 始
向上移动
向下移动
- Source Git
+ Source Git
偏好设置
关于
出错了
@@ -298,7 +298,7 @@
删除
拉回
- 拉回(拉取并合并)
+ 拉回(拉取并合并)
远程 :
拉取分支 :
本地分支 :
@@ -313,37 +313,37 @@
同时推送标签
启用强制推送
- 推送标签到远程仓库
+ 推送标签到远程仓库
标签 :
远程仓库 :
- 变基操作
+ 变基操作
分支 :
目标提交 :
自动贮藏并恢复本地变更
- 添加远程仓库
+ 添加远程仓库
编辑远程仓库
远程名 :
唯一远程名
仓库地址 :
远程仓库的地址
- 分支重命名
+ 分支重命名
分支 :
新的名称 :
新的分支名不能与现有分支名相同
- 重置当前分支到指定版本
+ 重置当前分支到指定版本
当前分支 :
提交 :
重置模式 :
- 确定要回滚吗?
+ 确定要回滚吗?
目标提交 :
回滚后提交更改
- 偏好设置
+ 偏好设置
通用配置
需要重启软件
显示语言 :
@@ -376,14 +376,13 @@
选填,用于命名此贮藏
包含未跟踪的文件
- 贮藏列表
+ 贮藏列表
贮藏列表
查看变更
- 不显示未跟踪的文件
- 对比提交 : {0} -> {1}
+ 对比提交 : {0} -> {1}
- 检测更新
+ 检测更新
{0}已发布!
发布时间
GIT版本
@@ -409,13 +408,13 @@
没有提交信息记录
最近输入的提交信息
- 检测到挑选提交冲突!
+ 检测到挑选提交冲突!
检测到变基冲突!
检测到回滚提交冲突!
检测到分支合并冲突!
GIT尚未配置。请打开【偏好设置】配置GIT路径。
- 路径({0})不存在或不可读取!
+ 路径({0})不存在或不可读取!
无法找到bash.exe,请确保其在git.exe同目录中!
二进制文件不支持该操作!!!
选中文件不支持该操作!!!
diff --git a/src/Views/Popups/CreateBranch.xaml.cs b/src/Views/Popups/CreateBranch.xaml.cs
index c9227320..d79211dc 100644
--- a/src/Views/Popups/CreateBranch.xaml.cs
+++ b/src/Views/Popups/CreateBranch.xaml.cs
@@ -62,7 +62,7 @@ namespace SourceGit.Views.Popups {
if (AutoStash) {
var changes = new Commands.LocalChanges(repo).Result();
if (changes.Count > 0) {
- if (!new Commands.Stash(repo).Push(null, "NEWBRANCH_AUTO_STASH", true)) {
+ if (!new Commands.Stash(repo).Push(changes, "NEWBRANCH_AUTO_STASH")) {
return false;
}
} else {
diff --git a/src/Views/Popups/Stash.xaml.cs b/src/Views/Popups/Stash.xaml.cs
index f6165e17..0a48044e 100644
--- a/src/Views/Popups/Stash.xaml.cs
+++ b/src/Views/Popups/Stash.xaml.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.IO;
using System.Threading.Tasks;
namespace SourceGit.Views.Popups {
@@ -9,14 +10,14 @@ namespace SourceGit.Views.Popups {
///
public partial class Stash : Controls.PopupWidget {
private string repo = null;
- private List files = null;
+ private List changes = null;
- public Stash(string repo, List files) {
+ public Stash(string repo, List changes) {
this.repo = repo;
- this.files = files;
+ this.changes = changes;
InitializeComponent();
- chkIncludeUntracked.IsEnabled = files == null || files.Count == 0;
+ chkIncludeUntracked.IsEnabled = changes == null || changes.Count == 0;
}
public override string GetTitle() {
@@ -29,15 +30,21 @@ namespace SourceGit.Views.Popups {
return Task.Run(() => {
Models.Watcher.SetEnabled(repo, false);
- if (files == null || files.Count == 0) {
- new Commands.Stash(repo).Push(null, message, includeUntracked);
- } else {
- for (int i = 0; i < files.Count; i += 10) {
- var count = Math.Min(10, files.Count - i);
- var step = files.GetRange(i, count);
- new Commands.Stash(repo).Push(step, message, includeUntracked);
+
+ if (changes == null || changes.Count == 0) {
+ changes = new Commands.LocalChanges(repo).Result();
+ }
+
+ var jobs = new List();
+ foreach (var c in changes) {
+ if (c.WorkTree == Models.Change.Status.Added || c.WorkTree == Models.Change.Status.Untracked) {
+ if (includeUntracked) jobs.Add(c);
+ } else {
+ jobs.Add(c);
}
}
+
+ new Commands.Stash(repo).Push(changes, message);
Models.Watcher.SetEnabled(repo, true);
return true;
});
diff --git a/src/Views/Widgets/Stashes.xaml b/src/Views/Widgets/Stashes.xaml
index 1b9fdb9c..7d4538a8 100644
--- a/src/Views/Widgets/Stashes.xaml
+++ b/src/Views/Widgets/Stashes.xaml
@@ -27,8 +27,14 @@
+
+
@@ -71,25 +77,19 @@
-
-
-
-
-
+
+
+
-
-
+
diff --git a/src/Views/Widgets/WorkingCopyChanges.xaml.cs b/src/Views/Widgets/WorkingCopyChanges.xaml.cs
index da3217bd..b95698d1 100644
--- a/src/Views/Widgets/WorkingCopyChanges.xaml.cs
+++ b/src/Views/Widgets/WorkingCopyChanges.xaml.cs
@@ -306,8 +306,8 @@ namespace SourceGit.Views.Widgets {
}
private async void SaveAsPatch(string saveTo, List changes) {
- FileStream stream = new FileStream(saveTo, FileMode.Create);
- StreamWriter writer = new StreamWriter(stream);
+ var stream = new FileStream(saveTo, FileMode.Create);
+ var writer = new StreamWriter(stream);
foreach (var c in changes) {
await Task.Run(() => new Commands.SaveChangeToStream(repo, c, writer).Exec());
@@ -353,7 +353,7 @@ namespace SourceGit.Views.Widgets {
var stash = new MenuItem();
stash.Header = App.Text("FileCM.Stash");
stash.Click += (o, e) => {
- new Popups.Stash(repo, files).Show();
+ new Popups.Stash(repo, changes).Show();
e.Handled = true;
};
@@ -416,7 +416,7 @@ namespace SourceGit.Views.Widgets {
var stash = new MenuItem();
stash.Header = App.Text("FileCM.StashMulti", changes.Count);
stash.Click += (o, e) => {
- new Popups.Stash(repo, files).Show();
+ new Popups.Stash(repo, changes).Show();
e.Handled = true;
};
@@ -475,7 +475,7 @@ namespace SourceGit.Views.Widgets {
var stash = new MenuItem();
stash.Header = App.Text("FileCM.Stash");
stash.Click += (o, e) => {
- new Popups.Stash(repo, files).Show();
+ new Popups.Stash(repo, changes).Show();
e.Handled = true;
};
@@ -538,7 +538,7 @@ namespace SourceGit.Views.Widgets {
var stash = new MenuItem();
stash.Header = App.Text("FileCM.StashMulti", changes.Count);
stash.Click += (o, e) => {
- new Popups.Stash(repo, files).Show();
+ new Popups.Stash(repo, changes).Show();
e.Handled = true;
};