How to replace folder with symlink on a server












0















We have a git repository for a scientific software where we need to maintain a certain folder structure for our data files.
These folders should remain empty, everything that will be put there should not be tracked by git. However, it is necessary that those folders exist.



The solution to accomplish this was to add a .gitignore file into every directory which looks like this:



*
!.gitignore


which means everything inside this folder is ignored except for the .gitignore file.



This works very well.



We maintain all our data on one particular server.
Our scientists use this server often for their calculations.
It would be very convenient to be able to replace the data folders from the git repository which currently contain only the .gitignore file with a symbolic link to the full data files on this server. The data files on the server also have a .gitignore file which looks exactly the same as in every repository.



I wrote a bash script to do this which looks like this:



rm -r path/to/empty/data/in/repository/name
ln -sfn /absolute/path/to/data/on/server/ path/to/empty/data/in/repository


Now the software runs perfectly and you have access to all the data without copying it into your git repository.



However, git now gets confused.



If I run git status only my changes are listed as expected. It does not complain about the new symbolic links which replaced the existing directories.



As soon as I run git add . to stage my changes the symbolic links appear as new file: and the .gitignore files in the replaced folder are listed as deleted:.



This seems like a problem to me because as soon as somebody pushes his code changes that he made on the server the symbolic links would get uploaded (I guess) and the .gitignore files would get removed and thus the folder structure would not remain.



Is it possible to tell git that it should compare the content of the symbolic linked folders rather than the symbolic link itself?



PS: I know this seems like a software design issue with the static folder structure which is inside git but I do not want to discuss this here. We are all scientists and no programmers and the software is now developed for over 10 years by many different people. It is not possible to change the code to make it more flexible.



EDIT: This bash code reproduces the problem:



cd ~            #setup
mkdir tmp
cd tmp

mkdir server #server data folder (this one is full of data)
mkdir server/data
printf '*n!.gitignore' > server/data/.gitignore
printf 'data file 1' > server/data/data1.txt
printf 'data file 2' > server/data/data2.txt

mkdir repo #repo data folder (this one only contains .gitignore file)
mkdir repo/data
printf '*n!.gitignore' > repo/data/.gitignore

cd repo # create a dummy repo
git init
git add .
git commit -am"commit 1"

git status

cd .. # replace data folder with server/data folder which hase exactly the same content
rm -r repo/data/
ln -sfn ~/tmp/server/data/ ./repo/

cd repo
git status


At the end git status should ideally not list any changes in the repository.



EDIT:
I found a workaround: instead of linking the whole directory I'm now linking the content of the directory:



ln -sfn /absolute/path/to/data/on/server/* path/to/empty/data/in/repository/


this works because the symbolic links are irgnored due to the .gitignore file.
Drawback is that it only works with existing data. As soon as there is a new file in the server directory I have to run the bash script again.










share|improve this question





























    0















    We have a git repository for a scientific software where we need to maintain a certain folder structure for our data files.
    These folders should remain empty, everything that will be put there should not be tracked by git. However, it is necessary that those folders exist.



    The solution to accomplish this was to add a .gitignore file into every directory which looks like this:



    *
    !.gitignore


    which means everything inside this folder is ignored except for the .gitignore file.



    This works very well.



    We maintain all our data on one particular server.
    Our scientists use this server often for their calculations.
    It would be very convenient to be able to replace the data folders from the git repository which currently contain only the .gitignore file with a symbolic link to the full data files on this server. The data files on the server also have a .gitignore file which looks exactly the same as in every repository.



    I wrote a bash script to do this which looks like this:



    rm -r path/to/empty/data/in/repository/name
    ln -sfn /absolute/path/to/data/on/server/ path/to/empty/data/in/repository


    Now the software runs perfectly and you have access to all the data without copying it into your git repository.



    However, git now gets confused.



    If I run git status only my changes are listed as expected. It does not complain about the new symbolic links which replaced the existing directories.



    As soon as I run git add . to stage my changes the symbolic links appear as new file: and the .gitignore files in the replaced folder are listed as deleted:.



    This seems like a problem to me because as soon as somebody pushes his code changes that he made on the server the symbolic links would get uploaded (I guess) and the .gitignore files would get removed and thus the folder structure would not remain.



    Is it possible to tell git that it should compare the content of the symbolic linked folders rather than the symbolic link itself?



    PS: I know this seems like a software design issue with the static folder structure which is inside git but I do not want to discuss this here. We are all scientists and no programmers and the software is now developed for over 10 years by many different people. It is not possible to change the code to make it more flexible.



    EDIT: This bash code reproduces the problem:



    cd ~            #setup
    mkdir tmp
    cd tmp

    mkdir server #server data folder (this one is full of data)
    mkdir server/data
    printf '*n!.gitignore' > server/data/.gitignore
    printf 'data file 1' > server/data/data1.txt
    printf 'data file 2' > server/data/data2.txt

    mkdir repo #repo data folder (this one only contains .gitignore file)
    mkdir repo/data
    printf '*n!.gitignore' > repo/data/.gitignore

    cd repo # create a dummy repo
    git init
    git add .
    git commit -am"commit 1"

    git status

    cd .. # replace data folder with server/data folder which hase exactly the same content
    rm -r repo/data/
    ln -sfn ~/tmp/server/data/ ./repo/

    cd repo
    git status


    At the end git status should ideally not list any changes in the repository.



    EDIT:
    I found a workaround: instead of linking the whole directory I'm now linking the content of the directory:



    ln -sfn /absolute/path/to/data/on/server/* path/to/empty/data/in/repository/


    this works because the symbolic links are irgnored due to the .gitignore file.
    Drawback is that it only works with existing data. As soon as there is a new file in the server directory I have to run the bash script again.










    share|improve this question



























      0












      0








      0








      We have a git repository for a scientific software where we need to maintain a certain folder structure for our data files.
      These folders should remain empty, everything that will be put there should not be tracked by git. However, it is necessary that those folders exist.



      The solution to accomplish this was to add a .gitignore file into every directory which looks like this:



      *
      !.gitignore


      which means everything inside this folder is ignored except for the .gitignore file.



      This works very well.



      We maintain all our data on one particular server.
      Our scientists use this server often for their calculations.
      It would be very convenient to be able to replace the data folders from the git repository which currently contain only the .gitignore file with a symbolic link to the full data files on this server. The data files on the server also have a .gitignore file which looks exactly the same as in every repository.



      I wrote a bash script to do this which looks like this:



      rm -r path/to/empty/data/in/repository/name
      ln -sfn /absolute/path/to/data/on/server/ path/to/empty/data/in/repository


      Now the software runs perfectly and you have access to all the data without copying it into your git repository.



      However, git now gets confused.



      If I run git status only my changes are listed as expected. It does not complain about the new symbolic links which replaced the existing directories.



      As soon as I run git add . to stage my changes the symbolic links appear as new file: and the .gitignore files in the replaced folder are listed as deleted:.



      This seems like a problem to me because as soon as somebody pushes his code changes that he made on the server the symbolic links would get uploaded (I guess) and the .gitignore files would get removed and thus the folder structure would not remain.



      Is it possible to tell git that it should compare the content of the symbolic linked folders rather than the symbolic link itself?



      PS: I know this seems like a software design issue with the static folder structure which is inside git but I do not want to discuss this here. We are all scientists and no programmers and the software is now developed for over 10 years by many different people. It is not possible to change the code to make it more flexible.



      EDIT: This bash code reproduces the problem:



      cd ~            #setup
      mkdir tmp
      cd tmp

      mkdir server #server data folder (this one is full of data)
      mkdir server/data
      printf '*n!.gitignore' > server/data/.gitignore
      printf 'data file 1' > server/data/data1.txt
      printf 'data file 2' > server/data/data2.txt

      mkdir repo #repo data folder (this one only contains .gitignore file)
      mkdir repo/data
      printf '*n!.gitignore' > repo/data/.gitignore

      cd repo # create a dummy repo
      git init
      git add .
      git commit -am"commit 1"

      git status

      cd .. # replace data folder with server/data folder which hase exactly the same content
      rm -r repo/data/
      ln -sfn ~/tmp/server/data/ ./repo/

      cd repo
      git status


      At the end git status should ideally not list any changes in the repository.



      EDIT:
      I found a workaround: instead of linking the whole directory I'm now linking the content of the directory:



      ln -sfn /absolute/path/to/data/on/server/* path/to/empty/data/in/repository/


      this works because the symbolic links are irgnored due to the .gitignore file.
      Drawback is that it only works with existing data. As soon as there is a new file in the server directory I have to run the bash script again.










      share|improve this question
















      We have a git repository for a scientific software where we need to maintain a certain folder structure for our data files.
      These folders should remain empty, everything that will be put there should not be tracked by git. However, it is necessary that those folders exist.



      The solution to accomplish this was to add a .gitignore file into every directory which looks like this:



      *
      !.gitignore


      which means everything inside this folder is ignored except for the .gitignore file.



      This works very well.



      We maintain all our data on one particular server.
      Our scientists use this server often for their calculations.
      It would be very convenient to be able to replace the data folders from the git repository which currently contain only the .gitignore file with a symbolic link to the full data files on this server. The data files on the server also have a .gitignore file which looks exactly the same as in every repository.



      I wrote a bash script to do this which looks like this:



      rm -r path/to/empty/data/in/repository/name
      ln -sfn /absolute/path/to/data/on/server/ path/to/empty/data/in/repository


      Now the software runs perfectly and you have access to all the data without copying it into your git repository.



      However, git now gets confused.



      If I run git status only my changes are listed as expected. It does not complain about the new symbolic links which replaced the existing directories.



      As soon as I run git add . to stage my changes the symbolic links appear as new file: and the .gitignore files in the replaced folder are listed as deleted:.



      This seems like a problem to me because as soon as somebody pushes his code changes that he made on the server the symbolic links would get uploaded (I guess) and the .gitignore files would get removed and thus the folder structure would not remain.



      Is it possible to tell git that it should compare the content of the symbolic linked folders rather than the symbolic link itself?



      PS: I know this seems like a software design issue with the static folder structure which is inside git but I do not want to discuss this here. We are all scientists and no programmers and the software is now developed for over 10 years by many different people. It is not possible to change the code to make it more flexible.



      EDIT: This bash code reproduces the problem:



      cd ~            #setup
      mkdir tmp
      cd tmp

      mkdir server #server data folder (this one is full of data)
      mkdir server/data
      printf '*n!.gitignore' > server/data/.gitignore
      printf 'data file 1' > server/data/data1.txt
      printf 'data file 2' > server/data/data2.txt

      mkdir repo #repo data folder (this one only contains .gitignore file)
      mkdir repo/data
      printf '*n!.gitignore' > repo/data/.gitignore

      cd repo # create a dummy repo
      git init
      git add .
      git commit -am"commit 1"

      git status

      cd .. # replace data folder with server/data folder which hase exactly the same content
      rm -r repo/data/
      ln -sfn ~/tmp/server/data/ ./repo/

      cd repo
      git status


      At the end git status should ideally not list any changes in the repository.



      EDIT:
      I found a workaround: instead of linking the whole directory I'm now linking the content of the directory:



      ln -sfn /absolute/path/to/data/on/server/* path/to/empty/data/in/repository/


      this works because the symbolic links are irgnored due to the .gitignore file.
      Drawback is that it only works with existing data. As soon as there is a new file in the server directory I have to run the bash script again.







      bash git gitignore symlink






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 22 '18 at 15:12







      user7431005

















      asked Nov 22 '18 at 13:28









      user7431005user7431005

      987419




      987419
























          1 Answer
          1






          active

          oldest

          votes


















          1














          Git tracks symbolic links. What you're trying to achieve can be done with bind mounts.



          Replace the final ln -sfn ~/tmp/server/data/ ./repo/ with sudo mount --bind $PWD/repo
          $HOME/tmp/server/data/






          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53432061%2fhow-to-replace-folder-with-symlink-on-a-server%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            Git tracks symbolic links. What you're trying to achieve can be done with bind mounts.



            Replace the final ln -sfn ~/tmp/server/data/ ./repo/ with sudo mount --bind $PWD/repo
            $HOME/tmp/server/data/






            share|improve this answer






























              1














              Git tracks symbolic links. What you're trying to achieve can be done with bind mounts.



              Replace the final ln -sfn ~/tmp/server/data/ ./repo/ with sudo mount --bind $PWD/repo
              $HOME/tmp/server/data/






              share|improve this answer




























                1












                1








                1







                Git tracks symbolic links. What you're trying to achieve can be done with bind mounts.



                Replace the final ln -sfn ~/tmp/server/data/ ./repo/ with sudo mount --bind $PWD/repo
                $HOME/tmp/server/data/






                share|improve this answer















                Git tracks symbolic links. What you're trying to achieve can be done with bind mounts.



                Replace the final ln -sfn ~/tmp/server/data/ ./repo/ with sudo mount --bind $PWD/repo
                $HOME/tmp/server/data/







                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Nov 23 '18 at 9:13

























                answered Nov 22 '18 at 14:21









                Ricardo BrancoRicardo Branco

                3,4051817




                3,4051817
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53432061%2fhow-to-replace-folder-with-symlink-on-a-server%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    這個網誌中的熱門文章

                    Academy of Television Arts & Sciences

                    L'Équipe

                    1995 France bombings