Git: Checkout only files without repository?

前端 未结 6 1498
故里飘歌
故里飘歌 2020-12-13 04:31

i\'d like to just checkout the files without the .git files and the whole repository. It\'s because i\'d like to manage a website (php & html) with git and i\'m looking

相关标签:
6条回答
  • 2020-12-13 04:39

    You could create a tar archive in a git working directory and copy the tar to the server:

    git archive -o foo.tar HEAD
    scp foo.tar server:
    
    0 讨论(0)
  • 2020-12-13 04:40

    You'd probably benefit from a bare repo plus post-receive hook.

    This method is useful if you desire to push changes to your server but don't want the htdocs themselves under version control.

    We'll make a folder for the bare git repo. I like to put it in the same parent folder as htdocs:

    mkdir barerepo.git
    cd barerepo.git
    git --bare init 
    

    Then create a post-receive hook file, make it executable:

    touch hooks/post-receive
    chmod ug+x hooks/post-receive
    

    Edit post-receive in your favorite text editor:

    GIT_WORK_TREE=/full/path/to/htdocs git checkout -f
    # optional stuff:
    cd down/to/some/directory
    [do some stuff]
    

    Now every time you push to this bare repo it will checkout the working tree to htdocs. But htdocs itself is not under version control; running git status in htdocs will give the error fatal: Not a git repository (or any parent up to mount point /data). It's just plain files.

    Note that you must always push from master for this to work otherwise git checkout won't know what branch to checkout.

    0 讨论(0)
  • 2020-12-13 04:43

    The git-archive manpage contains the following example:

    git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)

    Create a tar archive that contains the contents of the latest commit on the current branch, and extract it in the '/var/tmp/junk' directory.

    Or you can use low level git-checkout-index, which manpage contains the following example:

    Using git checkout-index to "export an entire tree"

    The prefix ability basically makes it trivial to use 'git checkout-index' as an "export as tree" function. Just read the desired tree into the index, and do

       $ git checkout-index --prefix=git-export-dir/ -a
    

    git checkout-index will "export" the index into the specified directory.

    The final "/" is important. The exported name is literally just prefixed with the specified string.

    Or you can try to use --work-tree option to git wrapper, or GIT_WORK_TREE environment variable, e.g. by using "git --work-tree=/somwehere/else checkout -- .".

    0 讨论(0)
  • 2020-12-13 04:51

    git clone --depth 1 does exactly what you want. I have a git repository with 41,000 commits and this is vastly faster. See this answer or this more general response for a more detailed explanation.

    If you want to specify the branch to use (instead of the default "master" branch) use this syntax (requires Git 1.9+):

    git clone -b <remoteBranch> --single-branch --depth 1 ssh://username@servername.net:serverport/PathToProject <FolderName>
    
    0 讨论(0)
  • 2020-12-13 04:52

    Git is much easier than Subversion for this, as the whole repository is held in a single directory. You only need to delete the hidden ".git" folder in the root of the project to create a production-ready copy of your site.

    In Linux/OSX this would be:

    mkdir dist && cd dist
    git checkout --depth=1 http://path/to/your/project.git
    rm -rf .git
    
    0 讨论(0)
  • 2020-12-13 04:57

    Expanding on seanhodges answer, you could just rsync the project's files to wherever you need to put them and use --exclude to avoid the .git directory.

    rsync -avz --exclude=.git /source/directory/ user@remote-server.com:/target-directory
    

    I didn't test that command so feel free to edit it, but you get the jist.

    A useful option is to add --dry-run to the end of the command, that will show you what files will be sent without actually making any changes.

    0 讨论(0)
提交回复
热议问题