题 Git push需要用户名和密码


我从我的Github帐户克隆了一个git存储库到我的PC。

我想使用我的PC和笔记本电脑,但有一个Github帐户。

当我尝试使用我的PC从Github推送或拉出时,它需要用户名和密码,但在使用笔记本电脑时则不需要!

每次与原点交互时,我都不想输入用户名和密码。 我在这里缺少什么?


1072
2017-07-03 20:25


起源


是的,但我该怎么办?我生成了keygen还有什么? - TooCooL
您需要使用您的Github帐户注册pubkey(github.com/account/ssh)并配置您的SSH客户端以使用正确的用户名。 - jwodder
我已经完成了所有这些但仍需要用户名和密码!是否可以在两台PC上使用一个帐户? - TooCooL
这个问题非常适合您的所有选择: stackoverflow.com/questions/5343068/... - ford
无需再切换到ssh。它也可以通过HTTPS实现。检查我的答案。 - Varun Achar


答案:


常见的错误是使用默认值(HTTPS)而不是SSH进行克隆。您可以转到存储库,单击“克隆或下载”,然后单击URL字段上方的“使用SSH”按钮并更新原始远程URL,如下所示:

git remote set-url origin git@github.com:username/repo.git

这在GitHub中有记录: 将远程URL从HTTPS切换到SSH


1582
2017-07-03 21:25



要弄清楚如何更改URL,请转到此处: stackoverflow.com/a/2432799/60488 (扰流板: git remote set-url origin git://new.url.here) - Johan Kool
再次使用https有什么问题? - OscarRyz
如果您不能使用ssh进行安全限制(比如我),您可以:git remote set-url origin https://name:password@github.org/repo.git  (摘自此处的评论) - Bruno Berisso
为什么使用HTTPS克隆是一个常见的错误? GitHub现在建议使用HTTPS。 - Dennis
修正我的 Permission denied (publickey) 使用本指南: help.github.com/articles/generating-ssh-keys 。 - voltrevo


使用Git存储库进行永久身份验证,

运行以下命令以启用 凭证缓存

$ git config credential.helper store
$ git push https://github.com/repo.git

Username for 'https://github.com': <USERNAME>
Password for 'https://USERNAME@github.com': <PASSWORD>

使用也应指明 缓存过期

git config --global credential.helper 'cache --timeout 7200'

启用凭据缓存后,将对其进行缓存 7200秒(2小时)


173
2018-02-17 13:30



谢谢 ........ - Sak


我刚遇到同样的问题,我发现最简单的解决方案是使用SSH URL而不是HTTPS URL:

ssh://git@github.com/username/repo.git

而不是这个:

https://github.com/username/repo.git

您现在可以验证 只是 该 SSH Key 而不是 username 和 password


110
2018-06-14 07:19



解决问题的最简单方法是编辑远程原始URL。就这样。完成。感谢名单! - JOM
这对我有用,但首先我需要解决这个问题: stackoverflow.com/questions/2643502/... - Sridhar-Sarnobat


除了更改为SSH之外,如果您不介意以明文形式输入密码,也可以继续使用HTTPS。把它放在你的 ~/.netrc 并且它不会要求您的用户名/密码(至少在Linux和Mac上):

machine github.com
       login <user>
       password <password>

加成 (参见VonC的第2条评论):在Windows上,文件名是 %HOME%\_netrc

如果您想要加密,还请阅读VonC的第一条评论。

另外一个 (请参阅user137717的评论),如果有,可以使用 git 1.7.10或更新版本

使用凭证助手在git中缓存您的github密码 :

如果您使用HTTPS克隆GitHub存储库,则可以使用   凭证助手告诉Git记住你的GitHub用户名和   每次与GitHub交谈时都会输入密码。

这也适用于Linux,Mac和Windows。


105
2018-01-19 19:08



是的,它适用于Linux,但不适用于Windows上的gitbash。 - Dielson Sales
从安全角度来看,这是一个非常糟糕的主意。 - dolmen
@dolmen我明白你的意思,但如果你介意把密码放在一个明文中,你可以......加密它;)见 stackoverflow.com/a/18362082/6309。这甚至与Github的双因素身份验证(2FA)兼容: stackoverflow.com/a/18607931/6309 - VonC
如果您调用文件,@ Sale可以在Windows会话或Windows上的git bash中完美运行 %HOME%\_netrc (代替 ~/.netrc)。也可以看看 stackoverflow.com/a/18362082/6309 加密该文件。 - VonC
你不需要用明文或加密它。帮助程序实用程序将为您缓存它,并设置30秒。 help.github.com/articles/caching-your-github-password-in-git/... - user137717


对于那些对以前的答案感到困惑的外行人,您可以这样做:

git remote -v

这将回应类似的东西

origin  https://yourname@github.com/yourname/yourrepo.git (fetch)
origin  https://yourname@github.com/yourname/yourrepo.git (push)

然后你可以运行许多其他建议的命令,但现在你知道你的名字和你的上面的你的回复,所以你可以剪切和粘贴 yourname/yourrepo.git 从上到下

git remote set-url origin git@github.com:yourname/yourrepo.git

69
2018-02-13 17:22



我试过这个。它要求我 paraphrase 每次。我没有设置一个 - samayo
什么代替 yourrepo? - Raphi
@Raphi跑 git remote -v 看看会发生什么 - Davide
其他答案应该在此建议之前。 - Bennett Brown


如果您正在使用ssh并且您的私钥使用密码加密,那么 当您使用Git进行网络操作时,仍会提示您输入私钥的密码/密码 喜欢 pushpull,和 fetch

使用ssh-agent保存私钥密码/密码凭据

如果您想避免每次都输入密码,您可以使用 ssh-agent 如我所解释的那样,每个终端会话存储一次私钥密码凭证 我的答案无法打开与身份验证代理的连接

$ eval `ssh-agent -s`
$ ssh-add

在Windows msysgit Bash中,您需要评估输出 ssh-agent,但我不确定您是否需要在其他开发环境和操作系统中执行相同操作。

ssh-add 在你家找一把私钥 .ssh 文件夹叫 id_rsa,这是默认名称,但您可以将文件路径传递给具有不同名称的键。

杀死代理人

完成终端会话后,您可以关闭 ssh-agent 与杀戮旗帜 -k

$ ssh-agent -k

如中所述 ssh-agent 手册

-k

终止当前代理(由SSH_AGENT_PID环境变量给出)。

可选超时

此外,它可以采取可选的超时参数,如下所示:

$ ssh-add -t <timeout>

哪里 <timeout> 是格式 <n>h 对于 <n> 小时, <n>m 对于 <n> 分钟,等等。

根据 ssh-agent 手册

-t life

为添加的身份的最大生命周期设置默认值   给代理人。寿命可以以秒或以秒为单位指定   时间格式 sshd_config中(5)。指定的生命周期   与...的身份 SSH-加(1) 覆盖此值。没有   此选项的默认最长生命周期是永久的。

有关更多时间格式,请参阅此页面

Cygwin用户的安全警告

Cygwin用户应该知道一个 在Cygwin中使用ssh-agent的潜在安全风险

人们应该认识到这一点   在cygwin [1]下ssh-agent的潜在危险,虽然在本地   netstat和远程portscan它不会出现在指定的端口   任何人都可以访问/ tmp / ssh-foo ...?

[1]: http://www.cygwin.com/ml/cygwin/2001-01/msg00063.html

并在 引用链接

但请注意,cygwin的unix域套接字是 从根本上   不安全  所以我强烈 不鼓励 ssh-agent的用法   cygwin的。

当您在cygwin下运行ssh-agent时,它会创建AF_UNIX套接字    /tmp/ssh-$USERNAME/  目录。在cygwin下AF_UNIX套接字是   通过AF_INET套接字模拟。你可以很容易地看到,如果你看   成 /tmp/ssh-$USERNAME/agent-socket-*  通过记事本文件。你会看到的   类似的东西

!<socket >2080

然后运行 netstat -a 并且惊喜!你有一些程序在听   端口2080.它是ssh-agent。当ssh收到RSA挑战时   服务器,它指的是对应的 /tmp/ssh-$USERNAME/agent-socket-*   (在cygwin下,在我们的例子中,这意味着它将打开连接到    localhost:2080并要求ssh-agent处理RSA挑战   它有私钥,然后它只是传递从中收到的响应   ssh-agent到服务器。

在unix下,这样的场景没有问题,因为unix内核   程序尝试访问AF_UNIX套接字时检查权限。对于   但是,AF_INET套接字是匿名的(读取   “不安全”)。想象一下,你运行了cygwin ssh-agent。   恶意黑客可能会端口扫描你的盒子,找到使用的开放端口   ssh-agent,打开与ssh服务器的连接,接收RSA质询   从它,通过他发现的开放端口发送给你的ssh-agent,接收RSA   响应,发送到ssh服务器,瞧,他成功登录   像你一样到你的服务器。


48
2017-08-21 02:54



听起来不错而且细致。我照顾好了 https凭证助手,你照顾ssh连接! +1 - VonC


资源: 设置Git

以下命令将密码保存在内存中一段时间​​。
  (对于 git 1.7.10 或者更新。)

$ git config --global credential.helper cache
# Set git to use the credential memory cache

$ git config --global credential.helper 'cache --timeout=3600'
# Set the cache to timeout after 1 hour (setting is in seconds)

42
2017-09-01 02:55



我更喜欢'netrc'凭证帮助(stackoverflow.com/a/18362082/6309)用于缓存 多 凭证(无需记住每个密码)。但是如果你在Windows上并且想要使用内存缓存,则需要winstore(stackoverflow.com/a/15310274/6309) - VonC
这是迄今为止恕我直言的最佳答案。 - Chiel ten Brinke


当你使用 HTTPS 对于git pull&push,只需配置 remote.origin.url 对于您的项目,每次推送时都要避免输入用户名(或/和密码)。

如何配置 remote.origin.url

网址格式:
    HTTPS:// {用户名:密码@} github.com/ {所有者} / {回购}

url中的参数:
* 用户名
    可选,需要身份验证时使用的用户名,
    如果指定,则在需要身份验证时无需再次输入用户名,
    不要使用电子邮件,使用没有“@”的用户名,否则无法正确解析网址,
*密码
    可选,需要验证时使用的密码,
    如果指定,则需要验证时无需再次输入密码,
    小费:
        此值存储为纯文本,因此出于安全考虑,请不要指定此参数,
*

例如
    git config remote.origin.url https://eric@github.com/eric/myproject


@Update - 使用 ssh

我觉得用 ssh 协议是比一个更好的解决方案 https,即使设置步骤稍微复杂一些。

粗略的步骤:

  • 使用命令创建ssh密钥,例如 ssh-keygen 在Linux上,在Windows上 msysgit 提供类似的命令。
  • 将私钥保存在适当位置的本地计算机上,例如 ~/.ssh。并将其添加到ssh代理通过 ssh-add 命令。
  • 将公钥上传到git服务器。
  • 更改 remote.origin.url git存储库到 ssh 风格,例如 git@gitlab.com:myaccount/myrepo.git
  • 然后在拉或推时,无需输入用户名或密码。

提示:

  • 如果您的ssh密钥有密码短语,则默认情况下,您需要在每次重新启动计算机后首次使用密钥时输入密码。

@Update - 在之间切换 https 和 ssh 协议。

简单地改变 remote.origin.url 就足够了,或者你可以编辑 repo_home/.git/config 直接改变价值(例如使用 vi 在linux上)。

通常我会为每个协议添加一行,并使用其中一个注释掉 #

例如

[遥远的“原产地”]
        url = git@gitlab.com:myaccount / myrepo.git
        #url = https://myaccount@gitlab.com/myaccount/myrepo.git
        fetch = + refs / heads / *:refs / remotes / origin / *

28
2017-12-25 15:42



你确定吗? HTTP [s]的基于URL的URL支持用户名扩展?手册 git-fetch(1) 提到那只是为了 git/ssh基于URL的URL。 - day
@plmday是的,我正在使用它,我的git版本是1.8.2.3和1.8.4,我不确定更高版本是否会改变这一点。 - Eric Wang
NB在URL中提供您的密码(即使使用HTTPS)意味着您和您的存储库之间的所有内容都可以看到它。 - William
不,提供密码 https://username:password@github.com/ 是安全的。看到 stackoverflow.com/questions/4980912/... - slowhand
这就是我所寻求的(完全自动化) - Joshua


您可以在Git中缓存GitHub密码:

只需按照github的说明操作即可 官方文件

按照上述链接中的说明操作后,您应该可以在不每次输入用户名/密码的情况下向/从您的仓库进行推/拉。


15
2017-12-19 05:29



这是最好的答案,应该是公认的IMO - TheZuck
同意,引用官方文档的答案应该优先考虑。我很乐意遵循他们的指示,更喜欢使用标准惯例。 - johnnieb


热门问题

记录文件,类和构造函数的正确方法XIRR计算 | landcareweb.com landcareweb.com Toggle navigation 问题 题 XIRR计算 我如何计算Excel XIRR 使用C#的功能? 19 2018-03-03 11:03 起源 也许 来自Microsoft的这篇KB文章 有帮助吗? - Uwe Keim看我的编辑 - 我添加了完整的C#示例... - Agnius Vasiliauskas如果您觉得它能解决您的问题,请不要忘记将答案标记为已接受。 - Agnius Vasiliauskas对于任何想要查看Excel链接的人: msdn.microsoft.com/en-us/library/office/... - dyslexicanaboko好吧,我的一个朋友刚向我展示了这个,我还没有使用它 - 但它可能是一个部分答案,因为它不包括计算中的日期 msdn.microsoft.com/en-us/library/... - dyslexicanaboko答案: 根据 XIRR功能 openoffice文档(公式与excel中的相同)您需要在下面解决XIRR变量 F(XIRR) 方程: 您可以通过以下方式计算xirr值: 计算上述函数的导数 - > f'(xirr) 在拥有以后 f(xirr) 和 f'(xirr) 你可以通过迭代求解xirr值 牛顿的方法  - 着名的配方 - > 编辑 我有一点时间,这里是 - 用于XIRR计算的完整C#代码: class xirr { public const double tol = 0.001; public delegate double fx(double x); public static fx composeFunctions(fx f1, fx f2) { return (double x) => f1(x) + f2(x); } public static fx f_xirr(double p, double dt, double dt0) { return (double x) => p*Math.Pow((1.0+x),((dt0-dt)/365.0)); } public static fx df_xirr(double p, double dt, double dt0) { return (double x) => (1.0/365.0)*(dt0-dt)*p*Math.Pow((x+1.0),(((dt0-dt)/365.0)-1.0)); } public static fx total_f_xirr(double[] payments, double[] days) { fx resf = (double x) => 0.0; for (int i = 0; i < payments.Length; i++) { resf = composeFunctions(resf,f_xirr(payments[i],days[i],days[0])); } return resf; } public static fx total_df_xirr(double[] payments, double[] days) { fx resf = (double x) => 0.0; for (int i = 0; i < payments.Length; i++) { resf = composeFunctions(resf,df_xirr(payments[i],days[i],days[0])); } return resf; } public static double Newtons_method(double guess, fx f, fx df) { double x0 = guess; double x1 = 0.0; double err = 1e+100; while (err > tol) { x1 = x0 - f(x0)/df(x0); err = Math.Abs(x1-x0); x0 = x1; } return x0; } public static void Main (string[] args) { double[] payments = {-6800,1000,2000,4000}; // payments double[] days = {01,08,16,25}; // days of payment (as day of year) double xirr = Newtons_method(0.1, total_f_xirr(payments,days), total_df_xirr(payments,days)); Console.WriteLine("XIRR value is {0}", xirr); } } 顺便说一句,请记住,由于公式和/或牛顿法的限制,并非所有付款都会产生有效的XIRR! 干杯! 32 2018-03-03 18:53 它的工作完美,因为我想要thnax - Hitusam哇,干得好!!! - eka808请注意,如果您要尝试匹配Excel的结果,则需要将公差设置为0.00000001,如下所述,您可能希望添加代码以使迭代次数最大为100(或使其可配置)。 - Luther很干净的代码。谢谢。因为我需要在我的Java和Android应用程序中使用XIRR,所以我将移植到Java。你可以参考 github.com/yccheok/xirr 如果你需要。不使用闭包,因为代码需要与Java 6和7兼容。 - Cheok Yan Cheng 我开始了 0×69的解决方案,但最终一些新情况导致牛顿的方法失败。我创建了一个“智能”版本,当牛顿失败时,它使用Bisection Method(较慢)。 请注意我用于此解决方案的多个源的内联引用。 最后,您无法在Excel中重现某些场景,因为Excel本身使用牛顿的方法。参考 XIRR,是吗? 有趣的讨论。 使用系统; 使用System.Collections.Generic; 使用System.Linq; //请参阅以下文章: // http://blogs.msdn.com/b/lucabol/archive/2007/12/17/bisection-based-xirr-implementation-in-c.aspx // http://www.codeproject.com/Articles/79541/Three-Methods-for-Root-finding-in-C // http://www.financialwebring.org/forum/viewtopic.php?t=105243&highlight=xirr //基于Excel doc的默认值 // http://office.microsoft.com/en-us/excel-help/xirr-function-HP010062387.aspx 命名空间Xirr {     公共课程     {         private const DoublePersYear = 365.0;         private const int MaxIterations = 100;         private const double DefaultTolerance = 1E-6;         private const double DefaultGuess = 0.1; private static readonly Func<IEnumerable<CashItem>, Double> NewthonsMethod = cf => NewtonsMethodImplementation(cf, Xnpv, XnpvPrime); private static readonly Func<IEnumerable<CashItem>, Double> BisectionMethod = cf => BisectionMethodImplementation(cf, Xnpv); public static void Main(string[] args) { RunScenario(new[] { // this scenario fails with Newton's but succeeds with slower Bisection new CashItem(new DateTime(2012, 6, 1), 0.01), new CashItem(new DateTime(2012, 7, 23), 3042626.18), new CashItem(new DateTime(2012, 11, 7), -491356.62), new CashItem(new DateTime(2012, 11, 30), 631579.92), new CashItem(new DateTime(2012, 12, 1), 19769.5), new CashItem(new DateTime(2013, 1, 16), 1551771.47), new CashItem(new DateTime(2013, 2, 8), -304595), new CashItem(new DateTime(2013, 3, 26), 3880609.64), new CashItem(new DateTime(2013, 3, 31), -4331949.61) }); RunScenario(new[] { new CashItem(new DateTime(2001, 5, 1), 10000), new CashItem(new DateTime(2002, 3, 1), 2000), new CashItem(new DateTime(2002, 5, 1), -5500), new CashItem(new DateTime(2002, 9, 1), 3000), new CashItem(new DateTime(2003, 2, 1), 3500), new CashItem(new DateTime(2003, 5, 1), -15000) }); } private static void RunScenario(IEnumerable<CashItem> cashFlow) { try { try { var result = CalcXirr(cashFlow, NewthonsMethod); Console.WriteLine("XIRR [Newton's] value is {0}", result); } catch (InvalidOperationException) { // Failed: try another algorithm var result = CalcXirr(cashFlow, BisectionMethod); Console.WriteLine("XIRR [Bisection] (Newton's failed) value is {0}", result); } } catch (ArgumentException e) { Console.WriteLine(e.Message); } catch (InvalidOperationException exception) { Console.WriteLine(exception.Message); } } private static double CalcXirr(IEnumerable<CashItem> cashFlow, Func<IEnumerable<CashItem>, double> method) { if (cashFlow.Count(cf => cf.Amount > 0) == 0) throw new ArgumentException("Add at least one positive item"); if (cashFlow.Count(c => c.Amount < 0) == 0) throw new ArgumentException("Add at least one negative item"); var result = method(cashFlow); if (Double.IsInfinity(result)) throw new InvalidOperationException("Could not calculate: Infinity"); if (Double.IsNaN(result)) throw new InvalidOperationException("Could not calculate: Not a number"); return result; } private static Double NewtonsMethodImplementation(IEnumerable<CashItem> cashFlow, Func<IEnumerable<CashItem>, Double, Double> f, Func<IEnumerable<CashItem>, Double, Double> df, Double guess = DefaultGuess, Double tolerance = DefaultTolerance, int maxIterations = MaxIterations) { var x0 = guess; var i = 0; Double error; do { var dfx0 = df(cashFlow, x0); if (Math.Abs(dfx0 - 0) < Double.Epsilon) throw new InvalidOperationException("Could not calculate: No solution found. df(x) = 0"); var fx0 = f(cashFlow, x0); var x1 = x0 - fx0/dfx0; error = Math.Abs(x1 - x0); x0 = x1; } while (error > tolerance && ++i < maxIterations); if (i == maxIterations) throw new InvalidOperationException("Could not calculate: No solution found. Max iterations reached."); return x0; } internal static Double BisectionMethodImplementation(IEnumerable<CashItem> cashFlow, Func<IEnumerable<CashItem>, Double, Double> f, Double tolerance = DefaultTolerance, int maxIterations = MaxIterations) { // From "Applied Numerical Analysis" by Gerald var brackets = Brackets.Find(Xnpv, cashFlow); if (Math.Abs(brackets.First - brackets.Second) < Double.Epsilon) throw new ArgumentException("Could not calculate: bracket failed"); Double f3; Double result; var x1 = brackets.First; var x2 = brackets.Second; var i = 0; do { var f1 = f(cashFlow, x1); var f2 = f(cashFlow, x2); if (Math.Abs(f1) < Double.Epsilon && Math.Abs(f2) < Double.Epsilon) throw new InvalidOperationException("Could not calculate: No solution found"); if (f1*f2 > 0) throw new ArgumentException("Could not calculate: bracket failed for x1, x2"); result = (x1 + x2)/2; f3 = f(cashFlow, result); if (f3*f1 < 0) x2 = result; else x1 = result; } while (Math.Abs(x1 - x2)/2 > tolerance && Math.Abs(f3) > Double.Epsilon && ++i < maxIterations); if (i == maxIterations) throw new InvalidOperationException("Could not calculate: No solution found"); return result; } private static Double Xnpv(IEnumerable<CashItem> cashFlow, Double rate) { if (rate <= -1) rate = -1 + 1E-10; // Very funky ... Better check what an IRR <= -100% means var startDate = cashFlow.OrderBy(i => i.Date).First().Date; return (from item in cashFlow let days = -(item.Date - startDate).Days select item.Amount*Math.Pow(1 + rate, days/DaysPerYear)).Sum(); } private static Double XnpvPrime(IEnumerable<CashItem> cashFlow, Double rate) { var startDate = cashFlow.OrderBy(i => i.Date).First().Date; return (from item in cashFlow let daysRatio = -(item.Date - startDate).Days/DaysPerYear select item.Amount*daysRatio*Math.Pow(1.0 + rate, daysRatio - 1)).Sum(); } public struct Brackets { public readonly Double First; public readonly Double Second; public Brackets(Double first, Double second) { First = first; Second = second; } internal static Brackets Find(Func<IEnumerable<CashItem>, Double, Double> f, IEnumerable<CashItem> cashFlow, Double guess = DefaultGuess, int maxIterations = MaxIterations) { const Double bracketStep = 0.5; var leftBracket = guess - bracketStep; var rightBracket = guess + bracketStep; var i = 0; while (f(cashFlow, leftBracket)*f(cashFlow, rightBracket) > 0 && i++ < maxIterations) { leftBracket -= bracketStep; rightBracket += bracketStep; } return i >= maxIterations ? new Brackets(0, 0) : new Brackets(leftBracket, rightBracket); } } public struct CashItem { public DateTime Date; public Double Amount; public CashItem(DateTime date, Double amount) { Date = date; Amount = amount; } } } 25 2018-06-14 19:10 只是声明我正在使用您的代码并且它按预期工作。 - BrunoSalvino对于这段代码的采用者来说,这是一个很谨慎的说法,它很有用,但是你可能会遇到一个奇怪的边缘情况,你进入一个永无止境的循环,基本上是一个死锁。为了防止这种情况发生,我强烈建议在NewtonsMethod方法中添加100或者您认为合适的任何数字的最大迭代次数。像这样:while(err> TOLERANCE && i <100),在每次迭代时递增i。我得到的价值仍然是Excel给我的东西。这种情况只会发生(从我看到的情况)你正在收敛到无穷大,但不能很快到达那里。 - dyslexicanaboko我发现了另一个边缘情况,这一点很重要因为Excel中的结果不同。在NewtonsMethod方法内部 - 在计算期间,如果x0和x1是Infinity,则从该方法返回的结果是Infinity。原因是Infinity - Infinity = NaN,但x0在设置err后得到x1的值,因此最后一个值是Infinity。在excel中,结果为零!这里是我的数据集:值{-10000,10100,10000},日期{12/26 / 2010,12 / 26 / 2010,10 / 16/2012}。也许包括一个if语句寻找err == double.NaN,然后​​x0 = 0;我尚未决定。 - dyslexicanabokodyslexicanaboko:我遇到了Excel可以计算XIRR的情况但是在这个代码中的某些时候,错误最终为NaN所以我在这里得不到任何结果。 95%的其他测试用例都没问题。如果您对此有任何想法,请告诉我:-) - Luther我正在使用这个,我碰巧遇到一个返回NaN的Math.pow。虽然这是可以理解的,但我不知道excel是如何获得价值的。还有其他人经历过吗? - Milo Cabs 其他答案显示如何 实行 XIRR在C#中,但如果只是计算 结果 需要您可以通过以下方式直接调用Excel的XIRR函数: 首先添加对Microsoft.Office.Interop.Excel的引用,然后使用以下方法: public static double Xirr(IList<double> values, IList<DateTime> dates) { var xlApp = new Application(); var datesAsDoubles = new List<double>(); foreach (var date in dates) { var totalDays = (date - DateTime.MinValue).TotalDays; datesAsDoubles.Add(totalDays); } var valuesArray = values.ToArray(); var datesArray = datesAsDoubles.ToArray(); return xlApp.WorksheetFunction.Xirr(valuesArray, datesArray); } 3 2018-06-01 07:34 与其他答案中的C#代码实现相比,这可能会相当慢(但如果性能不是问题,那么这是一个很好的演示!)。 - user700390 感谢位于的nuget包的贡献者 Excel财务功能。它支持许多财务方法 - AccrInt,Irr,Npv,Pv,XIrr,XNpv等, 安装并导入包。 由于所有方法在Financial类中都是静态的,因此直接调用特定方法 Financial.<method_name> 带有必要的参数。 例: using Excel.FinancialFunctions; namespace ExcelXirr { class Program { static void Main(string[] args) { List<double> valList =new List<double>(); valList.Add(4166.67); valList.Add(-4166.67); valList.Add(-4166.67); valList.Add(-4166.67); List<DateTime> dtList = new List<DateTime>(); dtList.Add(new DateTime(2014, 9, 1)); dtList.Add(new DateTime(2014, 10, 1)); dtList.Add(new DateTime(2014, 11, 1)); dtList.Add(new DateTime(2014, 12, 1)); double result = Financial.XIrr(valList, dtList); Console.WriteLine(result); Console.ReadLine(); } } } 结果与Excel相同。 2 2018-04-04 09:52 让你知道它按预期工作。谢谢 - Mokhtar Ashour 热门问题 我如何将其他参数传递给Mat什么是.net 4.0 Expression Trees的一个很好Flex - 如何更改打开的DropDowAndroid Facebook获取所有个人使用不同的设置记录到