代码之家  ›  专栏  ›  技术社区  ›  Alfredo Palhares

Git和硬链接

  •  74
  • Alfredo Palhares  · 技术社区  · 14 年前

    考虑到Git不能识别指向存储库外部的符号链接,使用硬链接有问题吗?

    吉特能打破它们吗?

    4 回复  |  直到 8 年前
        1
  •  89
  •   Derek Mahar    7 年前

    “tree”对象表示Git中的目录,它存储文件名和(子集)权限。它不存储inode编号(或其他类型的文件id)。因此 不能用git表示 ,至少没有第三方工具,如 metastore git-cache-meta (即使使用这些工具,我也不确定是否可行)。

    Git试图不去接触那些不需要更新的文件,但是你必须考虑到Git不会试图保留硬链接,所以Git可能会破坏它们。


    指向存储库外部的符号链接 外部 git存储库,不受git控制。

        2
  •  22
  •   Niloct    4 年前

    我发现,使用钩子,你可以捕捉 git pull .git/hooks/post-merge 文件。

    首先,你必须 chmod +x 是的。

    然后,把 ln

    ls -i 显示文件在 pull


    我的例子 :

    #!/bin/sh
    ln -f $GIT_DIR/../apresentacao/apresentacao.pdf $GIT_DIR/../capa/apresentacao.pdf
    ln -f $GIT_DIR/../avaliacoesMono/avaliacao_monografias_2011_Nilo.pdf $GIT_DIR/../capa/avaliacoes.pdf
    ln -f $GIT_DIR/../posters/poster_Nilo_sci.pdf $GIT_DIR/../capa/poster.pdf
    ln -f $GIT_DIR/../monografia/monografia_Nilo.pdf $GIT_DIR/../capa/monografia_Nilo.pdf
    

    $GIT_DIR ,然后将部分相对路径添加到文件。

    -f

    编辑

    现代git客户机似乎自然地支持存储库中的符号链接和硬链接,即使是在将其推送到远程位置然后从中克隆时也是如此。我再也不需要在git回购之外链接了。。。

    $ mkdir tmp
    $ cd tmp
    $ git --version
    git version 2.24.3 (Apple Git-128)
    $ git init .
    Initialized empty Git repository in /Users/teixeira/tmp/.git/
    $ mkdir x
    $ cd x
    $ echo 123 > original
    $ cat original
    123
    $ cd ..
    $ ln -s x/original symlink
    $ cat symlink
    123
    $ ln x/original hardlink
    $ cat hardlink
    123
    $ git add .
    $ git commit -m 'Symlink and hardlink commit'
    [master (root-commit) 8df3134] Symlink and hardlink commit
     3 files changed, 3 insertions(+)
     create mode 100644 hardlink
     create mode 120000 symlink
     create mode 100644 x/original
    

    从本地git存储库克隆

    $ cd
    $ git clone tmp/ teste_tmp
    Cloning into 'teste_tmp'...
    done.
    $ cd teste_tmp/
    $ ls
    hardlink  symlink  x
    $ cat symlink
    123
    $ cat hardlink
    123
    

    从远程存储库克隆

    $ cd ~/tmp
    $ git remote add origin https://github.com/myUser/myRepo.git
    $ git push origin master
    Enumerating objects: 5, done.
    Counting objects: 100% (5/5), done.
    Delta compression using up to 8 threads
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (5/5), 361 bytes | 361.00 KiB/s, done.
    Total 5 (delta 0), reused 0 (delta 0)
    To https://github.com/myUser/myRepo.git
     + 964dfce...8df3134 master -> master
    $ cd ../
    $ git clone https://github.com/myUser/myRepo.git
    Cloning into 'myRepo'...
    remote: Enumerating objects: 5, done.
    remote: Counting objects: 100% (5/5), done.
    remote: Compressing objects: 100% (2/2), done.
    remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
    Unpacking objects: 100% (5/5), done.
    $ cd myRepo/
    $ cat symlink
    123
    $ cat hardlink
    123
    

    https://github.com/mokacoding/symlinks 还指出了一件重要的事情:符号链接必须相对地定义。

        3
  •  8
  •   VonC    14 年前

    从这个 msysgit issue

    msysGit中不支持。

    也, Git从未跟踪硬链接 .


        4
  •  2
  •   xce_git    13 年前

    Google'git preserve hard links'表明git不知道如何保存硬链接结构,也许是出于设计。

    我的网络项目使用如下硬链接:

    www/products/index.php
    www/products/dell_latitude_id577/index.php #(hard linked to above)
    www/products/dell_inspiron_id323/index.php #(hard linked again to above)
    
    me@server:www/products$ ls -l index.php
    -rwxr-xr-x 3 me me 1958 Aug 22 22:10 index.php*
    

    如果我想改变索引.php我在一个地方更改了它,硬链接(产品详细信息页面)指向了这些更改——只是git在克隆和在其他计算机上拉取时不保留这种关系。

    me@server:www$ git pull
    

    在另一台机器上创建新的索引.php对于每个硬链接。