Investigación de diferencias de Git en enlaces simbólicos y enlaces simbólicos de ruta relativa

13 min

language: ja bn en es fr hi ko pt ru zh-cn zh-tw

Hola, soy un inexperto.
Tenía curiosidad por saber qué sucede cuando se crea un enlace simbólico con git, así que lo probaré.

Patrones

  1. Enlace duro de /usr/bin/pwd: hardlink-pwd
  2. Enlace simbólico de /usr/bin/pwd: ln-s-link-pwd-usr-bin-pwd
  3. Archivo de texto llamado ./pwd
  4. Enlace simbólico de ./pwd: pwd-ln-s

Tenía curiosidad por saber qué sucede con un enlace duro de un binario ejecutable después de un git push y luego un git clone (aunque puedo adivinarlo sin hacerlo...). También me preguntaba si los enlaces simbólicos se mantienen incluso cuando están en un directorio superior gestionado por git, así que lo probaré.

Evidencia

alleycat:[haturatu]:~/git$ mkdir gitlinks
alleycat:[haturatu]:~/git$ cd gitlinks/
alleycat:[haturatu]:~/git/gitlinks$ ls
alleycat:[haturatu]:~/git/gitlinks$ pwd > pwd
alleycat:[haturatu]:~/git/gitlinks$ ls
pwd
alleycat:[haturatu]:~/git/gitlinks$ cat pwd 
/home/haturatu/git/gitlinks
alleycat:[haturatu]:~/git/gitlinks$ ln -s pwd pwd-ln-s
alleycat:[haturatu]:~/git/gitlinks$ ls
pwd  pwd-ln-s
alleycat:[haturatu]:~/git/gitlinks$ which pwd
/usr/bin/pwd
alleycat:[haturatu]:~/git/gitlinks$ ln /usr/bin/p
Display all 354 possibilities? (y or n)
alleycat:[haturatu]:~/git/gitlinks$ ln /usr/bin/pw
pw-cli            pw-dump           pw-profiler       pwconv            pwmconfig
pw-config         pw-link           pw-reserve        pwd               pwunconv
pw-container      pw-metadata       pw-top            pwdx              
pw-dot            pw-mon            pwck              pwhistory_helper  
alleycat:[haturatu]:~/git/gitlinks$ ln /usr/bin/pwd hardlink-pwd
ln: 'hardlink-pwd' から '/usr/bin/pwd' へのハードリンクの作成に失敗しました: 許可されていない操作です
alleycat:[haturatu]:~/git/gitlinks$ sudo ln /usr/bin/pwd hardlink-pwd
指紋読取装置に右の人差し指をなぞってください
alleycat:[haturatu]:~/git/gitlinks$ ls
hardlink-pwd  pwd  pwd-ln-s
alleycat:[haturatu]:~/git/gitlinks$ ls -la
合計 48
drwxr-xr-x   2 haturatu haturatu  4096  1月 13 01:50 .
drwxr-xr-x 115 haturatu haturatu  4096  1月 13 01:48 ..
-rwxr-xr-x   2 root     root     34944  8月 31 23:29 hardlink-pwd
-rw-r--r--   1 haturatu haturatu    28  1月 13 01:48 pwd
lrwxrwxrwx   1 haturatu haturatu     3  1月 13 01:49 pwd-ln-s -> pwd
alleycat:[haturatu]:~/git/gitlinks$ chown haturatu:haturatu hardlink-pwd 
chown: 'hardlink-pwd' の所有者を変更中: 許可されていない操作です
alleycat:[haturatu]:~/git/gitlinks$ sudo chown haturatu:haturatu hardlink-pwd 
alleycat:[haturatu]:~/git/gitlinks$ which pwd
/usr/bin/pwd
alleycat:[haturatu]:~/git/gitlinks$ ls -la /usr/bin/pwd
-rwxr-xr-x 2 haturatu haturatu 34944  8月 31 23:29 /usr/bin/pwd
alleycat:[haturatu]:~/git/gitlinks$ echo "# git-ln-s-test" >> README.md
alleycat:[haturatu]:~/git/gitlinks$ git init
git add README.md
git commit -m "first commit"
git branch -M main
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint:   git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint:   git branch -m <name>
Initialized empty Git repository in /home/haturatu/git/gitlinks/.git/
[master (root-commit) 3853932] first commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
alleycat:[haturatu]:~/git/gitlinks$ git remote add origin git@github.com:haturatu/git-ln-s-test.git
alleycat:[haturatu]:~/git/gitlinks$ vim pwd
alleycat:[haturatu]:~/git/gitlinks$ git add .
alleycat:[haturatu]:~/git/gitlinks$ git commit -m "yo"
[main ca78a3e] yo
 3 files changed, 3 insertions(+)
 create mode 100755 hardlink-pwd
 create mode 100644 pwd
 create mode 120000 pwd-ln-s
alleycat:[haturatu]:~/git/gitlinks$ vim pwd-ln-s 
alleycat:[haturatu]:~/git/gitlinks$ git commit -m "2"
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   pwd

no changes added to commit (use "git add" and/or "git commit -a")
alleycat:[haturatu]:~/git/gitlinks$ git add .
alleycat:[haturatu]:~/git/gitlinks$ git commit -m "2"
[main b3fd4ed] 2
 1 file changed, 1 insertion(+)
alleycat:[haturatu]:~/git/gitlinks$ ls -la
合計 56
drwxr-xr-x   3 haturatu haturatu  4096  1月 13 01:53 .
drwxr-xr-x 115 haturatu haturatu  4096  1月 13 01:48 ..
drwxr-xr-x   9 haturatu haturatu  4096  1月 13 01:54 .git
-rw-r--r--   1 haturatu haturatu    16  1月 13 01:53 README.md
-rwxr-xr-x   2 haturatu haturatu 34944  8月 31 23:29 hardlink-pwd
-rw-r--r--   1 haturatu haturatu    38  1月 13 01:54 pwd
lrwxrwxrwx   1 haturatu haturatu     3  1月 13 01:49 pwd-ln-s -> pwd
alleycat:[haturatu]:~/git/gitlinks$  ln -s /usr/bin/pwd ln-s-link-pwd-usr-bin-pwd
alleycat:[haturatu]:~/git/gitlinks$ git add .
alleycat:[haturatu]:~/git/gitlinks$ git commit -m "3"
[main 119febf] 3
 1 file changed, 1 insertion(+)
 create mode 120000 ln-s-link-pwd-usr-bin-pwd
alleycat:[haturatu]:~/git/gitlinks$ git diff
alleycat:[haturatu]:~/git/gitlinks$ git push -u origin main
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 4 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (14/14), 13.37 KiB | 4.46 MiB/s, done.
Total 14 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (2/2), done.
To github.com:haturatu/git-ln-s-test.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
alleycat:[haturatu]:~/git/gitlinks$ ls -la
合計 56
drwxr-xr-x   3 haturatu haturatu  4096  1月 13 01:55 .
drwxr-xr-x 115 haturatu haturatu  4096  1月 13 01:48 ..
drwxr-xr-x   9 haturatu haturatu  4096  1月 13 01:56 .git
-rw-r--r--   1 haturatu haturatu    16  1月 13 01:53 README.md
-rwxr-xr-x   2 haturatu haturatu 34944  8月 31 23:29 hardlink-pwd
lrwxrwxrwx   1 haturatu haturatu    12  1月 13 01:55 ln-s-link-pwd-usr-bin-pwd -> /usr/bin/pwd
-rw-r--r--   1 haturatu haturatu    38  1月 13 01:54 pwd
lrwxrwxrwx   1 haturatu haturatu     3  1月 13 01:49 pwd-ln-s -> pwd
alleycat:[haturatu]:~/git/gitlinks$ sudo chown root:root hardlink-pwd 
指紋読取装置に右の人差し指をなぞってください
指紋の検証に失敗しました
指紋読取装置に右の人差し指をなぞってください
指紋の検証に失敗しました
指紋読取装置に右の人差し指をなぞってください
alleycat:[haturatu]:~/git/gitlinks$ cd ..
alleycat:[haturatu]:~/git$ rm -rf gitl
gitlercuko/ gitlinks/   
alleycat:[haturatu]:~/git$ rm -rf getlinks
alleycat:[haturatu]:~/git$ git clone git@github.com:haturatu/git-ln-s-test.git
Cloning into 'git-ln-s-test'...
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 14 (delta 2), reused 14 (delta 2), pack-reused 0 (from 0)
Receiving objects: 100% (14/14), 13.37 KiB | 6.69 MiB/s, done.
Resolving deltas: 100% (2/2), done.
alleycat:[haturatu]:~/git$ cd git-ln-s-test/
alleycat:[haturatu]:~/git/git-ln-s-test$ ls -la
合計 56
drwxr-xr-x   3 haturatu haturatu  4096  1月 13 01:59 .
drwxr-xr-x 116 haturatu haturatu  4096  1月 13 01:59 ..
drwxr-xr-x   8 haturatu haturatu  4096  1月 13 01:59 .git
-rw-r--r--   1 haturatu haturatu    16  1月 13 01:59 README.md
-rwxr-xr-x   1 haturatu haturatu 34944  1月 13 01:59 hardlink-pwd
lrwxrwxrwx   1 haturatu haturatu    12  1月 13 01:59 ln-s-link-pwd-usr-bin-pwd -> /usr/bin/pwd
-rw-r--r--   1 haturatu haturatu    38  1月 13 01:59 pwd
lrwxrwxrwx   1 haturatu haturatu     3  1月 13 01:59 pwd-ln-s -> pwd

Resultados

Al parecer, los enlaces duros se desvinculan y el número de inode también cambia, por lo que se tratan como archivos separados.

Y con git log, pueden verificarlo en la GUI mirando mis registros de push, pero solo el archivo original del enlace simbólico muestra diferencias, mientras que el enlace simbólico en sí no muestra ninguna diferencia.

Cómo crear un enlace simbólico con una ruta relativa

Está bien si especifican una ruta relativa al crearlo.

alleycat:[haturatu]:~/git/gitlinks$ ln -s ../../../../usr/bin/pwd pwd-rel
alleycat:[haturatu]:~/git/gitlinks$ ls -la
合計 56
drwxr-xr-x   3 haturatu haturatu  4096  1月 13 02:16 .
drwxr-xr-x 116 haturatu haturatu  4096  1月 13 01:59 ..
drwxr-xr-x   9 haturatu haturatu  4096  1月 13 01:56 .git
-rw-r--r--   1 haturatu haturatu    16  1月 13 01:53 README.md
lrwxrwxrwx   1 haturatu haturatu    12  1月 13 02:08 ext4magic -> ../ext4magic
-rwxr-xr-x   2 root     root     34944  8月 31 23:29 hardlink-pwd
lrwxrwxrwx   1 haturatu haturatu    12  1月 13 01:55 ln-s-link-pwd-usr-bin-pwd -> /usr/bin/pwd
-rw-r--r--   1 haturatu haturatu    38  1月 13 01:54 pwd
lrwxrwxrwx   1 haturatu haturatu     3  1月 13 01:49 pwd-ln-s -> pwd
lrwxrwxrwx   1 haturatu haturatu    23  1月 13 02:16 pwd-rel -> ../../../../usr/bin/pwd

Related Posts