【问题标题】:git and hardlink in linuxlinux中的git和硬链接
【发布时间】:2012-01-29 17:20:37
【问题描述】:

我有一个 git repo test 和一个文件(zsh 配置文件),以及

ln ~/.zshrc test/zshrc

然后我更改了.zshrc文件,git repo中的zshrc文件没有改变,是git无法处理硬链接吗?

如果是这样,我该如何使用 git 来管理这些点文件?任何建议

【问题讨论】:

  • 如果文件有不同的内容,那么它们不会硬链接在一起。有东西破坏了链接。它可能是 git(当你改变分支或其他东西时)或其他东西,我不知道。您可以使用ls -li 检查 inode 编号或两个文件,以验证它们是否已硬链接。使用它来找出文件在什么时候被取消链接。

标签: linux git zsh


【解决方案1】:

Git 总是假定他是文件 inode 的唯一所有者。 所以 git checkout 只是破坏了所有的硬链接。

【讨论】:

  • 它并没有完全分解它们,它只是没有记录哪些文件共享一个 inode。然而,git 确实记录的是两者(至少在某个时间点)具有相同的内容并优化存储它。
【解决方案2】:

您不能在 git 存储库之外创建¹硬链接。您有多种选择:

  • 使~/.zshrc 成为my-home-git-checkout/zshrc 的符号链接。
  • 在您的主目录中保留一个 git checkout。
  • 将文件从 git checkout 复制到主目录,可能在提交或签出时自动复制。

¹ 是的,好吧,狡辩:你不能保留

【讨论】:

  • 最后的解决方案不应该是“在提交时”,而是“在更新(签出)时”。在这种情况下,文件是自动复制还是硬链接都没有关系。
  • @ZyX 关于结帐的好点,但为什么不提交呢?如果该 git 存储库是您通常编辑文件的地方,那么您很少会签出。
  • git 在提交时会覆盖文件吗?如果是,为什么?
  • @ZyX 啊,我想我明白了:如果您保留硬链接,那么您只需要在结帐(或重置或许多其他操作)后重新创建它们,而不是在提交后.我建议您制作副本并在推送新版本时更新副本的不同模式;我承认,如果您要这样做,那么直接将 ~ 设置为 git checkout 并没有多大意义。
  • 我在git help hooks 中没有看到post-reset 挂钩。唯一其他相关的钩子是post-receive 我相信,但谁会推送到本地存储库?尤其是当cd 1 && git push 2cd 2 && git pull 1 不等效时(更糟糕的是,它可能会因非裸存储库而失败)。
【解决方案3】:

尝试将以下脚本添加到/path/to/repo/.git/hooks/post-checkout(此文件必须是可执行的):

#!/bin/sh
/bin/ln -sf /path/to/repo/zshrc $HOME/.zshrc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    相关资源
    最近更新 更多