为什么git在添加时重命名这些文件?

时间:2017-05-16 16:15:52

标签: git pdf

我有一个包含大量PDF文件的git存储库。在对其中一些运行OCR之后,我运行git add .来获取更改并进行分级。之后,git status看起来像这样:

#       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取消了更改。

3 个答案:

答案 0 :(得分:4)

不要过多地读取git,说文件已重命名。在git中没有“重命名”操作这样的东西;事实上,它只是试图确定从先前提交的树到当前索引树(在git status的情况下)的转换是否可能涉及移动/重命名的文件;如果它这么认为,它会说“重命名”。

请记住,当您在处理PDF时,git看到的内容与您在显示PDF时看到的内容非常不同。 PDF中的数据通常是压缩的,因此不太明显是什么文本。从二进制角度来看,很多“内容”都建立了文档的结构,而且每个文件的结构都可能相同。

所以git的启发式方法很混乱。但事情就是这样:没关系。如果查看实际文件,它们每个都应该包含正确的数据。如果你认为虚假输出分散了注意力,我仍然不能责怪你。对于许多命令,您可以对重命名检测行为进行一些控制;不幸的是,我不知道为status压制它的“内置”方式。但有一个想法......

对于git期望遇到的类型的文件,重命名检测非常有效。当您存储二进制文件(如PDF)时,您会击败许多git的功能,因为这不是它的优化。使用git lfs可以使其表现得更好。

https://git-lfs.github.com/

这样做的主要目的是通过将大型二进制文件(git无法压缩/差异很好)移动到一个单独的“大文件存储”来限制核心存储库的大小,您只需从中下载一个版本需要特定版本。 (相比之下,“常规”仓库的克隆必须复制每个文件的每个版本,无论你要检查什么。)

但是这很酷:当你使用lfs时,核心git“认为”它只是存储这些小的“lfs指针” - lfs用于在必要时查找真实内容的占位符。在我的测试中,那些指针总是足够不同,以至于它们不被检测为“重命名”,除非文件按字面逐字节复制。

答案 1 :(得分:1)

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

Git并非设计用于跟踪二进制数据的更改,例如pdf编码的数据,因此您无法真正责怪它。当跟踪对二进制数据的更改时,所有投注都会关闭,因为这不是git的设计目标。它旨在跟踪(明文)源代码文件以进行版本控制。

答案 2 :(得分:1)

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

完整的详细信息非常复杂(请参阅my answerhow does git log --follow <filename> work?),但简短版本是git status从提交(HEAD)到索引运行git diff,打开重命名检测(给出内部默认值&#34; 50%相似&#34;)。因为PDF文件往往具有大的重复二进制块,其64字节块将散列到相同的槽,所以考虑任何两个PDF文件的机会&#34;至少50%相似&#34;是......好吧,&#34;高&#34;太强了:&#34;不太低&#34;会更准确。在上面的示例中,您正在击中128个中的30个,或者只有超过1个的5个文件正在获得错误的50%+匹配。

如果 这些不是PDF文件,则相似性得分可能非常有用。但you can't turn off rename detection in git status: it's always on,限制为200个未配对文件。

(在git status运行HEAD - vs-index差异之后,它运行第二个索引与文件差异。那个有重命名检测启用,因为它在这里没有意义。我之所以提到它只是因为它起初并不明显,git status所做的就是运行两个git diff。)