符号链接的Git差异调查和相对路径符号链接
大家好,我是无能。
我很好奇在使用git创建符号链接时会发生什么,所以我会尝试一下。
模式
/usr/bin/pwd的硬链接hardlink-pwd/usr/bin/pwd的符号链接ln-s-link-pwd-usr-bin-pwd- 名为
./pwd的文本文件 ./pwd的符号链接pwd-ln-s
我很好奇,当执行二进制文件的硬链接在git push之后再git clone时会发生什么(即使不做也能大概猜到结果,但还是想试试)。另外,我也想知道当符号链接位于git管理的上层目录中时,它是否会保持不变,所以我会尝试一下。
日志
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
结果
看来,硬链接本身确实会被解除,并且inode号也会发生变化,因此它们被视为单独的文件。
然后是git log,您可以在GUI上查看我推送的日志,只有符号链接的源文件会显示差异,但符号链接本身仍然不会显示差异。
如何创建相对路径符号链接
在创建时指定相对路径即可。
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