Почему так много идентичных исполняемых файлов git при компиляции из исходного кода? - PullRequest
2 голосов
/ 02 августа 2011
git                       
git-add                   
git-annotate              
git-apply                 
git-archive               
git-bisect--helper        
git-blame                 
git-branch                
git-bundle                
git-cat-file              
git-check-attr            
git-checkout              
git-checkout-index        
git-check-ref-format      
git-cherry                
git-cherry-pick           
git-clean                 
git-clone                 
git-commit                
git-commit-tree           
git-config                
git-count-objects         
git-describe              
git-diff                  
git-diff-files            
git-diff-index            
git-diff-tree             
git-fast-export           
git-fetch                 
git-fetch-pack            
git-fmt-merge-msg         
git-for-each-ref          
git-format-patch          
git-fsck                  
git-fsck-objects          
git-gc                    
git-get-tar-commit-id     
git-grep                  
git-hash-object           
git-help                  
git-index-pack            
git-init                  
git-init-db               
git-log                   
git-ls-files              
git-ls-remote             
git-ls-tree               
git-mailinfo              
git-mailsplit             
git-merge                 
git-merge-base            
git-merge-file            
git-merge-index           
git-merge-ours            
git-merge-recursive       
git-merge-subtree         
git-merge-tree            
git-mktag                 
git-mktree                
git-mv                    
git-name-rev              
git-notes                 
git-pack-objects          
git-pack-redundant        
git-pack-refs             
git-patch-id              
git-peek-remote           
git-prune                 
git-prune-packed          
git-push                  
git-read-tree             
git-receive-pack          
git-reflog                
git-remote                
git-remote-ext            
git-remote-fd             
git-replace               
git-repo-config           
git-rerere                
git-reset                 
git-revert                
git-rev-list              
git-rev-parse             
git-rm                    
git-send-pack             
git-shortlog              
git-show                  
git-show-branch           
git-show-ref              
git-stage                 
git-status                
git-stripspace            
git-symbolic-ref          
git-tag                   
git-tar-tree              
git-unpack-file           
git-unpack-objects        
git-update-index          
git-update-ref            
git-update-server-info    
git-upload-archive        
git-var                   
git-verify-pack           
git-verify-tag            
git-whatchanged           
git-write-tree            

Все эти цели имеют одинаковый размер: 4951925, и их содержимое идентично. Почему?

[root@ git-1.7.6]$ ls -il /usr/bin/git*
17823222 lrwxrwxrwx 1 root root 22 2011-01-24 11:43 /usr/bin/git -> /usr/local/git/bin/git
17823223 lrwxrwxrwx 1 root root 32 2011-01-24 11:43 /usr/bin/git-cvsserver -> /usr/local/git/bin/git-cvsserver
17823224 lrwxrwxrwx 1 root root 23 2011-01-24 11:43 /usr/bin/gitk -> /usr/local/git/bin/gitk
17823225 lrwxrwxrwx 1 root root 35 2011-01-24 11:43 /usr/bin/git-receive-pack -> /usr/local/git/bin/git-receive-pack
17823226 lrwxrwxrwx 1 root root 28 2011-01-24 11:43 /usr/bin/git-shell -> /usr/local/git/bin/git-shell
17823227 lrwxrwxrwx 1 root root 37 2011-01-24 11:43 /usr/bin/git-upload-archive -> /usr/local/git/bin/git-upload-archive
17823228 lrwxrwxrwx 1 root root 34 2011-01-24 11:43 /usr/bin/git-upload-pack -> /usr/local/git/bin/git-upload-pack



[root@ git-1.7.6]$ ls -li /usr/local/git/bin/git*
126612251 -rwxr-xr-x 107 root root 4686039 2011-01-24 11:42 /usr/local/git/bin/git
126614976 -rwxr-xr-x   2 root root  120960 2011-01-24 11:42 /usr/local/git/bin/git-cvsserver
126614978 -rwxr-xr-x   1 root root  321995 2011-01-24 11:42 /usr/local/git/bin/gitk
126612251 -rwxr-xr-x 107 root root 4686039 2011-01-24 11:42 /usr/local/git/bin/git-receive-pack
126612255 -rwxr-xr-x   2 root root 1952607 2011-01-24 11:42 /usr/local/git/bin/git-shell
126612251 -rwxr-xr-x 107 root root 4686039 2011-01-24 11:42 /usr/local/git/bin/git-upload-archive
126612252 -rwxr-xr-x   2 root root 2001993 2011-01-24 11:42 /usr/local/git/bin/git-upload-pack

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

Я думаю, что это делается для обратной совместимости, поскольку в более ранних версиях git каждая подкоманда git была отдельным исполняемым файлом (например, git-commit вместо git commit)

В более поздних версиях они делали их настоящими подкомандами с единственным реальным исполняемым файлом - git. Остальные могут быть просто ссылками на исполняемый файл git.

1 голос
/ 02 августа 2011

Потому что единственная настоящая команда - git.Остальные либо символически связаны с самим git, либо (что более вероятно) все они жестко связаны.

Когда два файла жестко связаны друг с другом, они ссылаются на одну копию на диске, хотя и с разными именами.Имена файлов - это просто указатели на определенный inode на диске. Именно так Linux / Unix отслеживает, где и где хранится.

Вы можете проверить это, выполнив:

$ ls -il /usr/bin/git*

Если онивсе они имеют одинаковые номера в первом столбце, а затем все ссылаются на один и тот же индекс.Число сразу после разрешений - это количество жестких ссылок на этот единственный индекс.Фактическое дисковое пространство для этого исполняемого файла (или любого файла с жесткими ссылками) не освобождается до тех пор, пока это число не достигнет нуля (все ссылки на него исчезнут).

(Кстати ... если они символически связаны с вами, ''мы увидим что-то вроде git-annotate -> git, что означает, что имя git-annotate ссылается на имя git, которое затем преобразуется в индекс, который содержит (указатель на) данные исполняемого файла)

Git себяэто одна программа, которая знает, как сделать много вещей в зависимости от того, как она называется.Вы можете позвонить либо git annotate, либо git-annotate, и они оба будут интерпретироваться одним двоичным файлом git для выполнения операции аннотирования.

Причина, по которой это сделано, просто для вашего удобства, естьничего, что само по себе git не нужно, так как вы всегда можете использовать форму git<space>command его вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...