为什么git要在add上重命名这些文件?

为什么git要在add上重命名这些文件?,git,pdf,Git,Pdf,我有一个包含大量PDF文件的git存储库。在其中一些机器上运行OCR后,我运行了git add。接受变化并将其分阶段进行。之后,git状态如下所示: # modified: Ackerman, Daniel J., 1971 ST.pdf # modified: Ackerman, Laura C., 2006 SD.pdf # modified: Adolphson, Donald G., 1956 ST.pdf # renamed:

我有一个包含大量PDF文件的git存储库。在其中一些机器上运行OCR后,我运行了git add。接受变化并将其分阶段进行。之后,git状态如下所示:

#       modified:   Ackerman, Daniel J., 1971 ST.pdf
#       modified:   Ackerman, Laura C., 2006 SD.pdf
#       modified:   Adolphson, Donald G., 1956 ST.pdf
#       renamed:    Baugh, Gerald R., 1956 ST.pdf -> Alkofer, Anton R., 1958 ST.pdf
#       modified:   Amundsen, Julie, 2012 ST.pdf
#       modified:   Babiracki, Dylan, 2015.pdf
#       renamed:    Wangerud, Kenneth W., 1973 ST.pdf -> Bailey, Palmer K., 1970 ST.pdf
#       modified:   Bakken, Wallace E., 1958 ST.pdf
#       modified:   Baugh, Gerald R., 1956 ST.pdf
#       modified:   Bednar, Jesse E., 1959 ST.pdf
#       modified:   Belanus, Luke 2016.pdf
#       modified:   Berg, Larry D., 1960 ST.pdf
#       modified:   Blanksma, Derrick J., 2011 SD.pdf
#       modified:   Blum, Raymond L., 1957 ST.pdf
#       renamed:    Overmoe, Terry H., 1956 ST.pdf -> Bonneville, John W., 1956 ST.pdf
#       modified:   Bonneville, John W., 1961.pdf
#       modified:   Brouillard, Lee A., 1977 ST.pdf
#       modified:   Brown, Ronald G., 1968 ST.pdf
#       modified:   Burrows, Robert A., 1995 ST.pdf
#       modified:   Bushaw, Dewey J., 1957 ST.pdf
#       modified:   Carns, Matthew, 2010 SD.pdf
#       modified:   Christensen, Robert E., 1958 ST.pdf
#       modified:   Christenson, Chase J., 2008.pdf
#       renamed:    Traynor, Terrance O. 1977 ST.pdf -> Clayton, Lee, 1960.pdf
#       modified:   Cook, Charles W., 1968 ST.pdf
#       modified:   Crowell, Anna M., 2011 ST.pdf
#       modified:   Davidson, Jerry, NA, ST.pdf
#       modified:   DeYaegher, Wilfred M., 1955 ST.pdf
#       modified:   Decker, Amy, 2005 SD.pdf
#       modified:   Degenstein, Joel A., 1975 ST.pdf
#       modified:   Dove. Andrea, 2014 ST.pdf
#       modified:   Elofson, Richard R., NA, ST.pdf
#       renamed:    Hoeft, Erin, 2014 ST.pdf -> Englerth, E. J., 1958 ST.pdf
#       modified:   Erickson, Kirth A., 1967 ST.pdf
#       modified:   Facca, Fosco V., 1970 ST.pdf
#       renamed:    Thomte, Dennis, NA, ST.pdf -> Flewitt, William E., 1957 ST.pdf
#       renamed:    Saunders, Gary, 1960 ST.pdf -> Forsgren, Frank M., 1980 ST.pdf
#       renamed:    Clayton, Lee, 1960.pdf -> Friestad, Harlan K., 1966 ST.pdf
#       modified:   Friestad, Mark B., 1970 ST.pdf
#       modified:   Friesz, Jacob; Bryantt, Tanner; Hanson, Luke; Delaney, Emily , 2014 SD.pdf
#       renamed:    Koons, Robert R., 1957.pdf -> Froelich, Larry L.,1964.pdf
#       renamed:    Halle, Richard, 1972 ST.pdf -> Galambos, William E., 1958 ST.pdf
#       renamed:    Huot, Ray E., NA ST.pdf -> Garske, Jay, 1957 ST.pdf
#       renamed:    Walsh, Michael W., 1956 ST.pdf -> Gillin, Donald S., 1958 ST.pdf
#       modified:   Gorecki, Charles 2007 SD.pdf
#       modified:   Gray, Lockhart R., 1958 ST.pdf
#       renamed:    Berg, Larry D., 1960 ST.pdf -> Groenewold, Joanne R., 1971 ST.pdf
#       modified:   Gunderson, Lori, 1998 SD.pdf
#       modified:   Halle, Richard, 1972 ST.pdf
#       modified:   Hannesson, James H., 1957 ST.pdf
#       modified:   Hartig, Caitlyn M., 2015 ST.pdf
#       modified:   Harvey, Erik W., 1991 ST.pdf
#       modified:   Hegle, Lloyd 2005.pdf
#       modified:   Hendrickson, Richard D., 1956 ST.pdf
#       modified:   Hesse, Damien; Krieger, Amanda; Padgett, Alex; Zander, Derek, 2012 SD.pdf
#       modified:   Hoeft, Erin, 2014 ST.pdf
#       modified:   Holweger, Todd L., 1995 ST.pdf
#       modified:   Hrabik, Jon, 2008 SD.pdf
#       modified:   Huot, Ray E., NA ST.pdf
#       modified:   Ignatius, Ashley, 2008 ST.pdf
#       modified:   Jahraus, Tim, NA, ST.pdf
#       modified:   Jeannotte, Tyson, 2015 ST.pdf
#       renamed:    Redmond, John C., 1955.pdf -> Jergens, Matthew, 2005 SD.pdf
#       modified:   Johnson, Corey 2009 SD.pdf
#       modified:   Johnson, Irwin S., 1957 ST.pdf
#       modified:   Jurgens, Matthew, 2005 SD.pdf
#       modified:   Klapperich, Ryan, 2004 ST.pdf
#       modified:   Klaudt, Elmer J.,1956 ST.pdf
#       modified:   Klosterman, Mary J., 1978.pdf
#       modified:   Knutson, Sean, 2007 SD.pdf
#       modified:   Koons, Robert R., 1957.pdf
#       modified:   Kringstad, Justin J., 2007 SD.pdf
#       modified:   Kume, Jack, 1958 ST.pdf
#       modified:   Lammers, Heather N., 2007 SD.pdf
#       renamed:    Ackerman, Daniel J., 1971 ST.pdf -> Lassila, Pentti, 1968 ST.pdf
#       modified:   Lindberg, Connor; Putkonen, Jaakko, 2015.pdf
#       renamed:    Brouillard, Lee A., 1977 ST.pdf -> Listoe, Bruce K., 1955 ST.pdf
#       renamed:    Blum, Raymond L., 1957 ST.pdf -> Lockrem, Timothy M., 1980 ST.pdf
#       renamed:    Cook, Charles W., 1968 ST.pdf -> Mathison, David J., 1964 ST.pdf
#       modified:   Meldahl, Charles, 1962.pdf
#       modified:   Mikkelson, D.H., 1956 ST.pdf
#       renamed:    Johnson, Irwin S., 1957 ST.pdf -> Moe, Richard B., 1958 ST.pdf
#       renamed:    Olien, Benjamin, 1957 ST.pdf -> Monsebroten, Dale R. 1966.pdf
#       modified:   Murphy, Edward C., 1979 ST.pdf
#       modified:   Myerchin, Paul H., 1994.pdf
#       modified:   Nelson, Kelly, NA, SD.pdf
#       modified:   Nestaval, Jerry E., 1958 ST.pdf
#       renamed:    Englerth, E. J., 1958 ST.pdf -> Norby, Rodney D., 1967 ST.pdf
#       modified:   Olien, Benjamin, 1957 ST.pdf
#       renamed:    Smith, Louis D., 1968.pdf -> Olson, Bruce A., 1974 ST.pdf
#       modified:   Opitz, Emil, 2007 ST.pdf
#       modified:   Overmoe, Terry H., 1956 ST.pdf
#       modified:   Peterson, Robert T., 1958 ST.pdf
#       renamed:    Solheim, Dale, 1957 ST.pdf -> Pilatzke, Richard H., 1976 ST.pdf
#       modified:   Quigley, Micheal L., 1958 ST.pdf
#       modified:   Ramsey, Bruce, 1972 ST.pdf
#       renamed:    DeYaegher, Wilfred M., 1955 ST.pdf -> Randich, Philip G., 1958 ST.pdf
#       renamed:    Lockrem, Timothy M., 1980 ST.pdf -> Rasanen, Ryan; Smrekar, Allison; Jahraus, Paul 2014 SD.pdf
#       modified:   Redmond, John C., 1955.pdf
#       modified:   Reishus, Mark, 1958 ST.pdf
#       modified:   Remple, Gary A., 1987 ST.pdf
#       modified:   Ries, Adam J., 2010 SD.pdf
#       modified:   Roehrich, Robert D., 1957.pdf
#       renamed:    Peterson, Robert T., 1958 ST.pdf -> Ross, James D., NA.pdf
#       modified:   Russell, Ashley, NA, ST.pdf
#       renamed:    Garske, Jay, 1957 ST.pdf -> Salomon, Nena 1974 ST.pdf
#       modified:   Samson, Sherry D., 1995.pdf
#       modified:   Sandven, John E., 2016 ST.pdf
#       modified:   Saunders, Gary, 1960 ST.pdf
#       modified:   Schmit, Craig R., 1970 ST.pdf
#       renamed:    Quigley, Micheal L., 1958 ST.pdf -> Schofeild, R.G., 1957.pdf
#       modified:   Smith, Daniel, 2009 SD.pdf
#       modified:   Smith, Louis D., 1968.pdf
#       modified:   Smith, Louis D., 1970 ST.pdf
#       modified:   Snyder, Jeffrey K., 1992 ST.pdf
#       renamed:    Davidson, Jerry, NA, ST.pdf -> Solheim, Dale, 1957 ST.pdf
#       modified:   Solie, Kevin L., 2008 SD.pdf
#       modified:   Stancel, Steve G., NA.pdf
#       modified:   Thompson, Gary G., 1962 ST.pdf
#       modified:   Thomte, Dennis, NA, ST.pdf
#       modified:   Traynor, Terrance O. 1977 ST.pdf
#       modified:   Trobec, Seth W., 2009 SD.pdf
#       modified:   Walker, Daniel M., 1979 ST.pdf
#       modified:   Walsh, Michael W., 1956 ST.pdf
#       modified:   Wangerud, Kenneth W., 1973 ST.pdf
#       renamed:    Degenstein, Joel A., 1975 ST.pdf -> Waxvik, John N., 1964 ST.pdf
#       modified:   Worden, Anna K., 2007 ST.pdf
#       modified:   Zejdlik, Roger C., 1956 ST.pdf
为什么它决定将其中一些文件重命名为完全不同的文件名?任何给定重命名行中的两个文件都存在-例如,有一个名为Degenstein,Joel a.,1975 ST.pdf的文件和另一个名为Waxvik,John N.,1964 ST.pdf的完全不同的文件。但出于某种原因,它决定将其中一个重命名为另一个

无论是一次添加一个文件还是一起添加,都没有什么区别。发生什么事了

我已经使用git reset取消显示此时的更改。

git是一个内容跟踪器,而不是文件跟踪器。Git没有重命名这些文件,而是说您重命名了这些文件,因为它们的内容非常相似

Git不是为跟踪二进制数据的变化而设计的,比如pdf编码的数据,所以你不能责怪它。当跟踪二进制数据的变化时,所有的赌注都是无效的,因为这不是git设计的目的。它设计用于跟踪纯文本源代码文件以实现版本控制。

Git是一个内容跟踪器,而不是文件跟踪器。Git没有重命名这些文件,而是说您重命名了这些文件,因为它们的内容非常相似


Git不是为跟踪二进制数据的变化而设计的,比如pdf编码的数据,所以你不能责怪它。当跟踪二进制数据的变化时,所有的赌注都是无效的,因为这不是git设计的目的。它被设计用来跟踪纯文本源代码文件以实现版本控制。

不要在git中读太多内容,说文件被重命名了。git中没有重命名操作;它只是在事后尝试确定,在git状态下,从先前提交的树到当前索引树的转换是否可能涉及移动/重命名文件;如果它认为是这样的话,它会说改名了

请记住,显示PDF时看到的内容与git处理PDF时看到的内容非常不同。PDF中的数据通常是经过压缩的,所以不太清楚文本是什么。从二进制的角度来看,很多内容都建立了文档的结构,而这些文件中的每一个都可能是相同的

所以git的启发法是混乱的。但问题是:这无关紧要。如果您查看实际的文件,则每个文件中都应该包含正确的数据。不过,如果你认为虚假的输出会分散你的注意力,我也不能责怪你。对于许多命令,您可以对重命名检测行为进行一些控制;我不知道一个内置的方式来抑制它的地位不幸的。但是有一个想法

对于git期望遇到的文件类型,重命名检测工作得非常好。当你存储像PDF这样的二进制文件时,你会破坏git的许多特性,因为这不是它优化的目的。通过使用git lfs,您可以使其表现得更好

这样做的主要目的是通过将git无法很好地压缩/区分的大型二进制文件移动到单独的大型文件存储中来限制核心repo的大小,只有在需要特定版本时才从该存储中下载该版本。相比之下,无论您签出什么,常规回购的克隆都必须复制每个文件的每个版本


但这里有一件很酷的事情:当你使用lfs时,core git认为它只是存储这些小lfs指针——lfs在必要时用来查找真实内容的占位符。在我的测试中,这些指针总是非常不同,除非文件被逐字节复制,否则它们不会被检测为重命名。

不要在git中读太多文件被重命名。git中没有重命名操作;它只是在事后尝试确定,在git状态下,从先前提交的树到当前索引树的转换是否可能涉及移动/重命名文件;如果它认为是这样的话,它会说改名了

请记住,显示PDF时看到的内容与git处理PDF时看到的内容非常不同。PDF中的数据通常是经过压缩的,所以不太清楚文本是什么。从二进制的角度来看,很多内容都建立了文档的结构,而这些文件中的每一个都可能是相同的

所以git的启发法是混乱的。但问题是:这无关紧要。如果您查看实际的文件,则每个文件中都应该包含正确的数据。不过,如果你认为虚假的输出会分散你的注意力,我也不能责怪你。对于许多命令,您可以对重命名检测行为进行一些控制;我不知道一个内置的方式来抑制它的地位不幸的。但是有一个想法

对于t的文件 git希望遇到的类型,重命名检测工作得很好。当你存储像PDF这样的二进制文件时,你会破坏git的许多特性,因为这不是它优化的目的。通过使用git lfs,您可以使其表现得更好

这样做的主要目的是通过将git无法很好地压缩/区分的大型二进制文件移动到单独的大型文件存储中来限制核心repo的大小,只有在需要特定版本时才从该存储中下载该版本。相比之下,无论您签出什么,常规回购的克隆都必须复制每个文件的每个版本


但这里有一件很酷的事情:当你使用lfs时,core git认为它只是存储这些小lfs指针——lfs在必要时用来查找真实内容的占位符。在我的测试中,这些指针总是非常不同,除非文件是逐字节复制的,否则它们不会被检测为重命名。

正如其他两个答案所指出的,问题是Git正在进行相似性分析,并猜测这些文件可能已被修改和重命名。这种错误的匹配是无害的,尽管一开始有些令人担忧

完整的细节相当复杂,但简短的版本是git status从提交头到索引运行git diff,启用了重命名检测,给出了50%相似的内部默认值。由于PDF文件往往具有大的重复二进制块,其64字节块将散列到同一个插槽中,因此任何两个PDF文件被认为至少50%相似的可能性是。。。好吧,高是太强了:不低会更准确。在上面的示例中,您在128个文件中找到了30个,或者在5个文件中有1个文件得到了50%以上的错误匹配

如果这些文件不是PDF文件,相似性分数可能会有用。但是,限制为200个未配对文件


在git status运行HEAD vs index diff之后,它会运行第二个index vs files diff。由于在这里没有意义,因此没有启用重命名检测。我提到它只是因为一开始并不明显,git status所做的是运行两个git差异。

正如其他两个答案所指出的,问题是git正在进行相似性分析,并猜测文件可能已被修改和重命名。这种错误的匹配是无害的,尽管一开始有些令人担忧

完整的细节相当复杂,但简短的版本是git status从提交头到索引运行git diff,启用了重命名检测,给出了50%相似的内部默认值。由于PDF文件往往具有大的重复二进制块,其64字节块将散列到同一个插槽中,因此任何两个PDF文件被认为至少50%相似的可能性是。。。好吧,高是太强了:不低会更准确。在上面的示例中,您在128个文件中找到了30个,或者在5个文件中有1个文件得到了50%以上的错误匹配

如果这些文件不是PDF文件,相似性分数可能会有用。但是,限制为200个未配对文件


在git status运行HEAD vs index diff之后,它会运行第二个index vs files diff。由于在这里没有意义,因此没有启用重命名检测。我之所以提到它,只是因为一开始并不明显,git status所做的就是运行两个git Diff。

但是所讨论的文件的内容完全不同,100%。例如,Baugh,Gerald文件被列为重命名为Alkofer,Anton文件,但两者分别存在,具有不同的文件名,其内容完全不同。下面是一些md5校验和。4d64c0f9402e36fd88d5ada5106a201b,杰拉尔德R.包,1956 ST.pdf;de1884ef318688b916a57c0b1d758449阿尔科弗,安东R.,1958 ST.pdf。当这两个文件在任何方面都不相同时,它是如何检测到它们是相同的呢?当您在adobe reader之类的工具中查看这些文件时,它们可能看起来不一样,但它们的二进制表示形式可能相似。尝试对文件执行diff或git diff。在这种情况下,MD5校验和几乎毫无意义。文件之间可能有99%的重叠,它们的MD5校验和将完全不同。请注意,git可能并没有说这些文件完全相同,但它认为它们非常接近,以至于您已经重命名了它们。这并不是100%的不同——事实上,您可以让git告诉您,它认为它们运行git diff时有多大的不同,它将显示相似性索引。这可能是因为PDF嵌入字体中的二进制数据非常相似,而不是您看到的内容.Hrm。当我运行git diff时,它没有显示任何类型的相似性索引——它只是显示所有文件都不同。我需要给它输入一些额外的参数吗?我在谷歌上搜索到了很多模糊的文档,没有任何例子。注意:我使用的是git 1.8.3.1,因为RHEL就是这么做的。它可能会检测到文件是二进制的,就像linux diff工具一样,所以它不想告诉你它们是如何
伊弗。这种差异看起来像胡说八道,人类无法理解。如果您真的想看到差异,可以使用cmp或vbindiff。如果你是emacs的人,你也可以使用它。我建议只添加文件,然后忘记它。Git不会覆盖您的文件,即使它认为存在重命名,所以您无需担心。如果你真的很偏执,把你的数据复制到某个地方,然后把git忘在一起。但是这些文件的内容完全不同,100%。例如,Baugh,Gerald文件被列为重命名为Alkofer,Anton文件,但两者分别存在,具有不同的文件名,其内容完全不同。下面是一些md5校验和。4d64c0f9402e36fd88d5ada5106a201b,杰拉尔德R.包,1956 ST.pdf;de1884ef318688b916a57c0b1d758449阿尔科弗,安东R.,1958 ST.pdf。当这两个文件在任何方面都不相同时,它是如何检测到它们是相同的呢?当您在adobe reader之类的工具中查看这些文件时,它们可能看起来不一样,但它们的二进制表示形式可能相似。尝试对文件执行diff或git diff。在这种情况下,MD5校验和几乎毫无意义。文件之间可能有99%的重叠,它们的MD5校验和将完全不同。请注意,git可能并没有说这些文件完全相同,但它认为它们非常接近,以至于您已经重命名了它们。这并不是100%的不同——事实上,您可以让git告诉您,它认为它们运行git diff时有多大的不同,它将显示相似性索引。这可能是因为PDF嵌入字体中的二进制数据非常相似,而不是您看到的内容.Hrm。当我运行git diff时,它没有显示任何类型的相似性索引——它只是显示所有文件都不同。我需要给它输入一些额外的参数吗?我在谷歌上搜索到了很多模糊的文档,没有任何例子。注意:我使用的是git 1.8.3.1,因为RHEL就是这么做的。它可能检测到文件是二进制的,就像linux diff工具一样,所以它不想确切地告诉你它们之间的区别。这种差异看起来像胡说八道,人类无法理解。如果您真的想看到差异,可以使用cmp或vbindiff。如果你是emacs的人,你也可以使用它。我建议只添加文件,然后忘记它。Git不会覆盖您的文件,即使它认为存在重命名,所以您无需担心。如果你真的很偏执,把你的数据复制到某个地方,然后把git忘在一起。@DanLowe git状态不尊重这个设置,是吗?@DanLowe-文档上说它只被Cellar命令所尊重,而不是所有Cellar都尊重它。“在我的测试中,状态不尊重它。@MarkAdelsberger Ok,删除了我的评论,以避免传播misinformation@DanLowegit状态并不尊重这种设置,是吗?@DanLowe——文档中说,它只受到Cellar命令的尊重——而不是所有Cellar命令的尊重。“在我的测试中,状态不尊重它。@MarkAdelsberger Ok,删除了我的评论,以避免传播错误信息