Thread (6 messages) 6 messages, 4 authors, 2020-05-04

Re: git fast-export not preserving executable permissions?

From: Taylor Blau <hidden>
Date: 2020-05-01 22:32:45

On Fri, May 01, 2020 at 09:35:28AM -0400, Doug Glidden wrote:
Taylor,
(My full response is below, but please in general do not top-quote mail
here.)
Thanks for your response! It looks like git does not actually
recognize the file as executable:

    $ git ls-tree HEAD
    100644 blob 7d2f57b2381766924e1e4ffcc62615c637bbd784    executable_script.sh
    100644 blob d1d7cf309e091f54f268503b31653d8eba42fe88
non_executable_file.txt

Now you have me wondering if the real problem here is that I'm working
in git-bash on a Windows machine, which means the file permissions
aren't completely native.
I was wondering if that was the case ;-). If you are using NTFS or
FAT32, neither of these filesystems support execute permission bits. (I
am certainly not an expert here, but I know that Dscho (cc'd) would be
able to answer authoritatively here.)

That said, *Git* understands executable permissions, even if your
filesystem doesn't. You can tell Git to mark a file as executable by
the following:

  $ git update-index --chmod=+x /path/to/file

and then committing the result. Round-tripping this through 'git
fast-{im,ex}port' should preserve the permissions from Git's
perspective, and ditto for checking out the contents of a repository on
a filesystem that does support the executable permission bit.
I'm going to run a similar experiment in a native Linux environment
and see if I get the same results. I'll let you know what I find.
Sounds good. I'll be very surprised if it doesn't work as you expect.
Thanks,
Doug



On Wed, Apr 29, 2020 at 2:49 PM Taylor Blau [off-list ref] wrote:
quoted
Hi Doug,

On Wed, Apr 29, 2020 at 09:36:31AM -0400, Doug Glidden wrote:
quoted
Hello Git world!

I have run into an issue that I cannot seem to resolve with git
fast-export. When running a fast-export on a repo that contains
scripts with executable permissions (e.g. a gradlew script), the
resulting export does not properly reflect the executable permissions
on the script files.
Interesting. fast-import and fast-export both understand executable
modes (although Git only understands the modes 644 and 755 for blobs),
so this should be working.

I can not reproduce the issue as-is. Round-tripping a fast-import and
fast-export preserves executable bits for me:

  #!/bin/bash

  set -e

  rm -rf repo client

  git init -q repo
  git init -q client

  (
    cd repo
    printf "x" >x
    printf "y" >y
    chmod +x x
    git add x y
    git commit -q -m "initial commit"
  )

  git -C repo fast-export HEAD | git -C client fast-import

  diff -u <(git -C repo ls-tree HEAD) <(git -C client ls-tree HEAD)
quoted
To illustrate this issue, I created a small sample repo, with one
executable file and one non-executable file. From the output below,
you can see that the mode in the output from fast-export is the same
for both files; according to the documentation for fast-import, the
mode for the executable file should be 100755 instead of 100644.

    $ ls -gG
    total 2
    -rwxr-xr-x 1 106 Apr 29 09:13 executable_script.sh*
    -rw-r--r-- 1  63 Apr 29 09:12 non_executable_file.txt

    $ git fast-export --all
    blob
    mark :1
    data 106
    #!/bin/bash

    # This is a shell script that should be executable.
    echo 'The script executed successfully!'

    blob
    mark :2
    data 63
    This file is a simple text file that should not be executable.

    reset refs/heads/dev
    commit refs/heads/dev
    mark :3
    author Doug [off-list ref] 1588167102 -0400
    committer Doug [off-list ref] 1588167102 -0400
    data 25
    Adding some sample files
    M 100644 :1 executable_script.sh
    M 100644 :2 non_executable_file.txt

Please let me know if there is any further information I can provide
about this issue.
Does Git think that the file is executable? Please run 'git ls-tree
HEAD' to find out.
quoted
Thank you,
Doug
Thanks,
Taylor
Thanks,
Taylor
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help