gpt4 book ai didi

git-svn - git-svn 如何处理行结尾?

转载 作者:行者123 更新时间:2023-12-02 09:58:37 26 4
gpt4 key购买 nike

我对 Git 本身通过 core.autocrlfcore.eol + gitattributes ( Tim's post is excellent ) 处理行结尾的方式感到非常满意。

我有一个 Windows Git 存储库,其 autocrlf 设置为 true。因此,所有文本文件都以 LF 形式存储在存储库中,并以 CRLF 形式存储在工作目录中。这个存储库是从 SVN 存储库克隆的,我们仍然使用它来推送/拉取(SVN 存储库是我们的中央存储库,用于触发 CI 等)。

但我不知道 git-svn 如何在推/拉操作期间处理行结尾。

谁能解释一下 git-svn 在这种情况下做了什么?

最佳答案

我对此也很感兴趣。假设您有一个通过 git svn clone 创建的存储库,我认为您可以将其分解为三个不同的问题:

  1. 在 git svn 获取时,将提交从 svn 移动到 git 存储库时,是否会发生任何 git 换行规范化/更改?
  2. 在 git 提交时是否发生任何 git 换行规范化/更改 [即在正常的本地 git 提交到带有 svn 远程的存储库期间]?合并/ rebase 时间怎么样?
  3. 在 git svn dcommit 时,在推送/重放/git 针对 svn 提交的任何内容时,是否会发生任何 git 换行规范化/更改?

我很想听听这些问题在理论上应该是正确的,但现在我做了一个小实验,似乎表明至少在第 1 种情况下没有换行规范化:

rem We'll make a svn repo with CRLF newlines, clone it into git with
rem autocrlf enabled, and try to see if that results in LF-only newlines
rem getting stored in the git repo

cd c:\code

rem Step 1. Prepare SVN repo with CRLF type newlines.
rem The pre-1.4 flag is to prevent an error during git clone.

svnadmin create --pre-1.4-compatible svnrepo
svn checkout file:///C:/code/svnrepo svnworking
cd svnworking
echo "First line" > file.txt
echo "Second line" >> file.txt
echo "Third line" >> file.txt
rem NOTE: At this point file.txt has CRLF newlines
svn add file.txt
svn commit -m "Add file.txt"
rem NOTE: At this point file.txt still has CRLF newlines
cd ..

rem Step 2. Clone the svn repo into git and inspect work copy newline type
git svn clone file:///C:/code/svnrepo gitrepo
rem The following outputs true on my machine
git config --get core.autocrlf
cd gitrepo
rem The following also outputs true on my machine
git config --get core.autocrlf
git svn fetch
rem NOTE: At this point file.txt (git working dir copy) has CRLF newlines

rem Step 3. Disable autocrlf to inspect repo's inner newline type
rem Use the following and my editor to set core.autocrlf to false:
git config --edit --local
rem This now prints false:
git config --get core.autocrlf
git checkout .
rem NOTE: At this point file.txt (git working dir copy) still has CRLF newlines
del file.txt
git checkout .
rem NOTE: Even after explicitly deleting the old one and checking out again,
rem file.txt still has CRLF newlines

如果 git 换行转换是在我的 git svn pull 期间发生的,那么我会期望 file.txt 在这一切的末尾有仅 LF 的换行符。

这是一个健全性检查,上面的步骤 3 实际上实现了存储库是否具有仅 LF 换行符的有效测试:

rem We'll a git repo with core.autocrlf on, then switch it off to
rem pull out a file

rem The following outputs true
git config --get core.autocrlf
git init gitcrtest
cd gitcrtest
rem The following still outputs true
git config --get core.autocrlf
echo "First line" > file.txt
echo "Second line" >> file.txt
echo "Third line" >> file.txt
git add file.txt
git commit -m "Add file.txt"
rem NOTE: At this point file.txt (git working dir copy) has CRLF newlines
rem Use the following to set core.autocrlf to false
git config --edit --local
git checkout .
rem NOTE: Now file.txt (git working dir copy) has LF-only newlines

综上所述,似乎当 git-svn 从 svn 拉取时,svn 提交会添加到 git 提交图中,而无需任何 crlf 转换,即使启用了 autocrlf 也是如此。也就是说,无论您的文件在 svn 存储库中具有什么类型的换行符,它们也将在您的 git 克隆中具有。 (但是你的 git 工作副本可能有不同的换行符类型。)

请注意,这与“git help attribute”中行尾规范化的讨论非常一致;规范化表现为将内容从存储库提取到工作目录的命令(例如 checkout 或合并)或将内容从工作目录移动到索引/存储库的命令(例如添加或提交)。 “Git svn fetch”似乎没有做任何一件事情,所以当时不会发生行尾标准化是有道理的。我对 dcommit 的作用比较模糊,所以我不确定当时是否需要行尾标准化。

请注意,如果在您的存储库/计算机上设置了 SVN 的 svn:eol-style 属性,则会出现额外的问题。我认为 SVN 默认是在其末尾进行行尾转换,但我不是 100% 确定。

更新:有关换行符的真实 svn->git 迁移视角,另请参阅 Tim Abell's description其中。 CRLF 换行符不会被 git-svn 转换为仅 LF 换行符,如果 git 的自动行尾标准化保持打开状态,则会产生不理想的结果。解决方案是规范 git 中的行结尾或禁用行尾规范化。

关于git-svn - git-svn 如何处理行结尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9909604/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com