В Git Bash для Windows 10, когда я делаю:
$ ls -la
-rw-r--r-- 1 user 1049089 10 Jul 23 19:00 .gitignore
-rwxr-xr-x 1 user 1049089 28 Sep 19 15:47 a.sh*
-rwxr-xr-x 1 user 1049089 28 Sep 19 15:47 b.sh*
Я вижу, что оба a.sh
и b.sh
являются исполняемыми.Также я убедился, что запустив оба сценария - так что с моей точки зрения файловой системы оба этих файла являются исполняемыми.
Но когда я делаю:
$ git ls-tree HEAD
100644 blob c91cb20899da1dc6da1752f8b9cdc59e58e50873 a.sh
100755 blob c91cb20899da1dc6da1752f8b9cdc59e58e50873 b.sh
Таким образом, с точки зрения git только b.sh
является исполняемым, что также имеет место, когда я клонирую свой репозиторий на jenkins и пытаюсь выполнить два сценария (только b.sh
исполняется).
Я пытался: chmod +x a.sh
, но git не подхватывает это и просто возвращает состояние, в котором ничего не говорится или ничего не было изменено.
Что происходит и как это исправить?
ОБНОВЛЕНИЕ:
Теперь у меня есть:
$ git config -l | grep core
core.symlinks=true
core.autocrlf=false
core.fscache=true
core.editor='C:\Program Files (x86)\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin
core.editor='C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -nosession
core.autocrlf=false
core.preloadindex=true
core.fscache=true
core.filemode=true
Это имеет смысл, поскольку я добавил core.filemode=true
в C:\Users\user\.gitconfig
:
...
[core]
editor = 'C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -nosession
autocrlf = false
preloadindex = true
fscache = true
fileMode = true
...
Но когда я клонирую новый репозиторий и снова запускаю его из внутри , репозиторий, который я получаю:
$ git clone ssh://git@host/my-repo.git
..
$ cd my-repo
$ git config -l | grep core
core.symlinks=true
core.autocrlf=false
core.fscache=true
core.editor='C:\Program Files (x86)\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin
core.editor='C:/Program Files (x86)/Notepad++/notepad++.exe' -multiInst -nosession
core.autocrlf=false
core.preloadindex=true
core.fscache=true
core.filemode=true
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
Теперь в нем перечислены две записи для core.filemode
.Первый, я полагаю, взят из файла .gitconfig из моей пользовательской папки, а второй (установлен в false), похоже, приходит из файла my-repo/.git/config
, который содержит:
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
ignorecase = true
[remote "origin"]
Что определяет, что устанавливается вmy-repo/.git/config
и почему установлено значение false?
На основании:
Git global core.fileMode false локально переопределяется на клоне
и:
Git игнорирует gitconfig?
кажется, мне нужно вручную изменить .git / config после клона, чтобы он имел какой-либо эффект.