GithubHelp home page GithubHelp logo

git-ftp's Introduction

git-ftp.py: quick and efficient publishing of Git repositories over FTP

Introduction

Some web hosts only give you FTP access to the hosting space, but you would still like to use Git to version the contents of your directory. You could upload a full tarball of your website every time you update but that's wasteful. git-ftp.py only uploads the files that changed.

Requirements: git-python 0.3.x
it can be installed with easy_install gitpython

We also have a PPA which you can install with sudo add-apt-repository ppa:niklas-fiekas/ppa and then sudo aptitude install git-ftp.

Usage: python git-ftp.py

Note: If you run git-ftp.py for the first time on an existing project you should upload to the hosting server a git-rev.txt file containing SHA1 of the last commit which is already present there. Otherwise git-ftp.py will upload and overwite the whole project which is not necessary.

Storing the FTP credentials

You can place FTP credentials in .git/ftpdata, as such:

[master]
username=me
password=s00perP4zzw0rd
hostname=ftp.hostname.com
remotepath=/htdocs
ssl=yes

[staging]
username=me
password=s00perP4zzw0rd
hostname=ftp.hostname.com
remotepath=/htdocs/staging
ssl=no

Each section corresponds to a git branch. FTP SSL support needs Python 2.7 or later.

Exluding certain files from uploading

Similarly to .gitignore you can specify files which you do not wish to upload. The default file with ignore patterns is .gitftpignore in project root directory, however you can specify your own for every branch in .git/ftpdata:

[branch]
... credentials ...
gitftpignore=.my_gitftpignore

Used syntax is same as .gitignore's with the exception of overriding patterns, eg. **!**some/pattern, which is not supported Negations within patterns works as expected.

Using a bare repository as a proxy

An additional script post-receive is provided to allow a central bare repository to act as a proxy between the git users and the ftp server.
Pushing on branches that don't have an entry in the ftpdata configuration file will have the default git behavior (git-ftp.py doesn't get called). One advantage is that users do not get to know the ftp credentials (perfect for interns).
This is how the workflow looks like:

User1 --+                          +--> FTP_staging
         \                        /
User2 -----> Git bare repository -----> FTP_master
         /                        \
User3 --+                          +--> FTP_dev

This is how the setup looks like (One ftpdata configuration file, and a symlink to the update hook):

root@server:/path-to-repo/repo.git# ls
HEAD  ORIG_HEAD  branches  config  description  ftpdata  hooks  info  objects  packed-refs  refs
root@server:/path-to-repo/repo.git# ls hooks -l
total 0
lrwxr-xr-x 1 root    root      29 Aug 19 17:17 post-receive -> /path-to-git-ftp/post-receive

License

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

git-ftp's People

Contributors

dl1ely avatar ezyang avatar micahchalmer avatar mousavian avatar niklasf avatar nviennot avatar patriksima avatar peteruhnak avatar ramblex avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

git-ftp's Issues

localpath setting

Choose to only upload a sub path of the repo.I quite often has a 'site' directory with the site in it and other files also in the repo.

They is a closed pull request about that #36

Unusual ports like 2121 are not supported

Traceback (most recent call last):
File "D:\Work\Projects\php_greeksoulmate\git-ftp.py", line 489, in
main()
File "D:\Work\Projects\php_greeksoulmate\git-ftp.py", line 147, in main
ftp = ftplib.FTP(options.ftp.hostname, options.ftp.username, options.ftp.password)
File "C:\Work\Python26\lib\ftplib.py", line 116, in init
self.connect(host)
File "C:\Work\Python26\lib\ftplib.py", line 131, in connect
self.sock = socket.create_connection((self.host, self.port), self.timeout)
File "C:\Work\Python26\lib\socket.py", line 547, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.gaierror: [Errno 11004] getaddrinfo failed

FTP upload path error

With the new commit (f149d16) files aren't uploaded with the right path, but in the root directory.

local version:
files/content/file.txt
is uploaded over ftp
file.txt
instead of
files/content/file.txt

I reverted back to commit c459e40

First initial complete upload was right but single files got into the wrong directory, which happened also with existing branch updating single file with path.

Error on Windows

I am getting the following error(s) when trying to upload git repository using 'python.exe git-ftp.py test' under Windows 7:

INFO: Using .git/ftpdata
Traceback (most recent call last):
File "git-ftp.py", line 357, in
main()
File "git-ftp.py", line 64, in main
if repo.is_dirty() and not options.commit:
File "C:\portable\python2.7\App\lib\site-packages\gitpython-0.3.2.rc1-py2.7.eg
g\git\repo\base.py", line 502, in is_dirty
len(self.git.diff('HEAD', '--cached', _default_args)):
File "C:\portable\python2.7\App\lib\site-packages\gitpython-0.3.2.rc1-py2.7.eg
g\git\cmd.py", line 227, in
return lambda *args, *_kwargs: self._call_process(name, _args, *_kwargs)
File "C:\portable\python2.7\App\lib\site-packages\gitpython-0.3.2.rc1-py2.7.eg
g\git\cmd.py", line 456, in _call_process
return self.execute(call, *__kwargs)
File "C:\portable\python2.7\App\lib\site-packages\gitpython-0.3.2.rc1-py2.7.eg
g\git\cmd.py", line 335, in execute
*_subprocess_kwargs
File "C:\portable\python2.7\App\lib\subprocess.py", line 679, in init
errread, errwrite)
File "C:\portable\python2.7\App\lib\subprocess.py", line 893, in _execute_chil
d
startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

As it seems it can successfully find gitpython and ftpdata, but something goes wrong later in execution...

Connecting in active mode

For now the script always connects to ftp server in passive mode. It would be nice to have ability to change it.

gitmodules

Hello.

I encountered this problem, since I added a submodule to a repository.

niklas@ubuntu:~/Repositories/consolero$ git ftp
INFO: Using .git/ftpdata
INFO: Uploading /2011/.gitmodules
Traceback (most recent call last):
    File "/usr/bin/git-ftp", line 270, in <module>
        main()
    File "/usr/bin/git-ftp", line 82, in main
        upload_diff(repo.git.diff("--name-status", hash, commit.hexsha).split("\n"), tree, ftp, base)
    File "/usr/bin/git-ftp", line 261, in upload_diff
        assert isinstance(node, Blob)
AssertionError

I'm eventually going to have a look at it, but since I don't have time to do it currently, I just wanted to let you know.

-- Kind regards, Niklas

Working with tags (idea)

Dunno if it's possible tot let git-ftp be triggered by tags instead of branches.

Somehow it feels more logic to roll-out tagged versions to ftp-servers in a production environment: put version 2.0 on FTP.

But it should be optional, because you don't want it for developing.

ImportError: cannot import name Submodule

On Ubuntu I have installed git and python-git with the command
aptitude install git python-git

After this I have installed git-ftp as described in the README.
The problem is when I try to start the script I get this error.

git-ftp

Traceback (most recent call last):
File "/usr/bin/git-ftp", line 48, in
from git import Tree, Blob, Repo, Git, Submodule
ImportError: cannot import name Submodule

Any suggestions?

Pushing on ftp

Old file deleted, but no new (changed) file uploaded.

$ python git-ftp.py 
FTP Password: 
Uploaded /html/newFile.txt
Deleted /html/changed1.php
Deleted /html/changed2.css

Missing new: changed1.php / changed2.css

Feature: Exclude section

Hi,
it might be useful to add section for excluding some files/folder that don't want on production server. Is it complicated?

Unable to upload files named by multibyte characters

My repository has a file named in Japanese こんにちは.txt and I got an error while git-ftp was trying to upload the file via FTP:

$ git push origin
Counting objects: 5, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 331 bytes, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: INFO: Using .git/ftpdata
remote: INFO: Base directory is /htdocs/ftp
remote: INFO: Uploading Hello.txt
remote: Traceback (most recent call last):
remote:   File "/usr/local/bin/git-ftp", line 364, in <module>
remote:     main()
remote:   File "/usr/local/bin/git-ftp", line 114, in main
remote:     upload_diff(repo, oldtree, tree, ftp, base)
remote:   File "/usr/local/bin/git-ftp", line 285, in upload_diff
remote:     node = tree[file]
remote:   File "/usr/local/python/lib/python2.7/site-packages/git/objects/tree.py", line 237, in __getitem__
remote:     return self.__div__(item)
remote:   File "/usr/local/python/lib/python2.7/site-packages/git/objects/tree.py", line 190, in __div__
remote:     raise KeyError( msg % file )
remote: KeyError: 'Blob or Tree named \'"\\\\343\\\\201\\\\223\\\\343\\\\202\\\\223\\\\343\\\\201\\\\253\\\\343\\\\201\\\\241\\\\343\\\\201\\\\257.txt"\' not found'
To [email protected]:git/sandbox.git
   e867eb3..21b1e92  master -> master

I hope this will be fixed. Thanks in advance.

Script Error - no name attribute

Hi, I downloaded the newest version of the script and it ends with following error message:

./git-ftp.py 
Traceback (most recent call last):
  File "./git-ftp.py", line 270, in 
    main()
  File "./git-ftp.py", line 52, in main
    repo, options, args = parse_args()
  File "./git-ftp.py", line 114, in parse_args
    options.branch = repo.active_branch.name
AttributeError: 'str' object has no attribute 'name'

Consider having a Makefile

Should we have a Makefile so that
sudo make install
copies git-ftp.py to a path where it can get executed as git-ftp and copies the new man page to a path where it is found and
sudo make uninstall
remove's them?

Maybe also have a check for dependencies, but I am definitely not an expert regarding this.

Fail on errors?

If an FTP error arrises, shouldn't the post-receive hook have an error exit status as well?
This would prevent half-uploaded wobsites that seem fine repository-wise.

SFTP support

Are you planning to add support for SFTP (based on SSH protocol)?

unable to upload file to github

hi All

when I am trying to upload my file into github I am getting this error message
"Something went wrong that shouldn't have. Please try again or contact support if the problem persists."
Please do help me to fix this issue

/A

AttributeError: 'NoneType' object has no attribute 'startswith'

Remote Path: /
Use SSL? n
Should I write ftp details to .git/ftpdata? y
INFO: Base directory is /
Traceback (most recent call last):
    File "/Users/programista/bin/git-ftp.py", line 489, in <module>
        main()
    File "/Users/programista/bin/git-ftp.py", line 163, in main
        gitftpignore = os.path.join(repo.working_dir, options.ftp.gitftpignore)
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 75, in join
        if b.startswith('/'):
AttributeError: 'NoneType' object has no attribute 'startswith'

I got this after configuring ftp details. Running again git-ftp.py worked (it uploaded new changes). OSX Yosemite

directory replaced by submodule deletes files

While playing with submodules i turned one of repository subdirs into submodule. When I uploaded the files the submodule was correctly uploaded but then the content was deleted since the files were removed from the parent repo.
I don't know if this is something we need to worry about, or maybe first process the main repo and only after that upload submodules?

import error

hello, i have an issue with git-ftp.py on mac OSX Maverick with python 2.7.5

File "git-ftp.py", line 51, in from git import version as git_version
ImportError: No module named git

Can you give me a way to fixe this issue.

Thank for you work

Best regards

SyntaxError: invalid syntax on git-ftp

This is the output:

remote: Uploading master...
remote: File "/home/git/git-ftp/git-ftp.py", line 139
remote: return "%o" % (mode & 0o777)
remote: ^
remote: SyntaxError: invalid syntax

I'm running python 2.4, cause need it for redhat, and I have GitPython installed with easy_install.

I would like help but I don't know python. The syntax is also very wired to me, I can't tell you if there is really an error…

Sending a file to another program before sending via FTP

I was wondering which place of code should I "hack" so that right before sending a file through FTP I could pass it to another program and after that send it to FTP.

We sometimes need to protect our PHP code before sending it to the client's server and would like to use a command line program like Zend Guard or ionCube PHP Encoder. Probably files are sent to the server one by one so protecting/compiling them with these tools one by one would not be very efficient - but it is better to have it this way than none.

If you could give some advice where to see around the code

Thanks
Michal

AttributeError

I don't know what's causing this, its probably an issue on my end, but I keep getting the following error:

kbjr@kbjr-desktop:~/public_html/jsk-website$ git ftp 
FTP Password: 
WARNING: Working copy is dirty; uncommitted changes will NOT be uploaded
Traceback (most recent call last):
  File "/home/kbjr/bin/git-ftp", line 228, in 
    main()
  File "/home/kbjr/bin/git-ftp", line 67, in main
    upload_all(tree, ftp, base)
  File "/home/kbjr/bin/git-ftp", line 161, in upload_all
    for item in tree.items():
  File "/usr/local/lib/python2.6/dist-packages/gitdb-0.5.1-py2.6-linux-i686.egg/gitdb/util.py", line 209, in __getattr__
    return object.__getattribute__(self, attr)
AttributeError: 'Tree' object has no attribute 'items'

This is on Ubuntu Karmic. Any other info you might need, just ask.

Pushing newly created branch

I created locally a new branch, let's say 'ftp-test'. I already had 'ftpdata' file configured with ftp credentials in [ftp-test] in the bare repository on the server. Though the branch 'ftp-test' was not present in the bare repository yet. I pushed it to the remote server and got the message:

Uploading ftp-test...
INFO: Using .git/ftpdata
INFO: Base directory is /experience
Traceback (most recent call last):
  File "/usr/local/git-ftp/git-ftp.py", line 325, in <module>
    main()
  File "/usr/local/git-ftp/git-ftp.py", line 69, in main
    raise BranchNotFound
__main__.BranchNotFound
error: hook declined to update refs/heads/ftp-test

I don't know if this is the issue of git itself or the git-ftp script. Of course when 'git-test' branch existed in the bare repository everything went smoothly.

PS. You could write in the README file, that one can upload git-rev.txt and put there the last revision used if they start using your script in an existing project. I mean - without it, every file gets uploaded again.

Thanks
Michal

FTP upload fails on submodules with bare proxy setup

Tried to upload, got this error;

remote: Traceback (most recent call last):
remote: File "_/git-ftp.py", line 357, in
remote: main()
remote: File "
_/git-ftp.py", line 107, in main
remote: upload_diff(repo, oldtree, tree, ftp, base)
remote: File "/***/git-ftp.py", line 299, in upload_diff
remote: module = node.module()
remote: File "/usr/local/lib/python2.6/dist-packages/GitPython-0.3.1-py2.6.egg/git/objects/submodule/util.py", line 30, in wrapper
remote: raise InvalidGitRepositoryError("Method '%s' cannot operate on bare repositories" % func.name)
remote: git.exc.InvalidGitRepositoryError: Method 'module' cannot operate on bare repositories

CHMOD Command on Windows FTP server

I try git-ftp on a Windows FTP server and it throws an error at this line

ftp.voidcmd('SITE CHMOD ' + format_mode(blob.mode) + ' ' + blob.path)

I suggest we ignore the CHMOD for windows FTP server.

feature request: improved symbolic link support

Before I was wise in the ways of ftp, I created several sites with a symbolic link in the root folder which points to a file in a submodule.

When I upload a site with such a configuration, it initially works perfectly. git-ftp uploads the symbink with no special treatment, and it shows up on the server as a copy of the file (ie dereferenced.)

All's well and good so far.

Trouble is, when I update the file in the submodule that the link points to, and git ftp push again, it doesn't re-upload the symbolic link. So then the copy on the server (the one that's a symbolic link on my home computer) is out of date.

My request: make it so git-ftp would upload the symbolic link again, when the file it links to is uploaded. And in particular that this works even if the target is in a submodule.

I hope that's clear.

Thank you for this very handy program!

Something wrong while uploading files.

remote: Uploading master...
remote: /home/git/git-ftp/git-ftp.py -b master -c 8f39f176301293d07161fe6a91ef8fb5c6f886b6
remote: INFO: Using .git/ftpdata
remote: INFO: Base directory is /httpdocs/
remote: INFO: Uploading app/config/schema/db_acl.php
remote: INFO: Uploading app/config/schema/i18n.php
remote: INFO: Uploading app/config/schema/sessions.php
remote: INFO: Uploading app/config/acl.ini.php
remote: INFO: Uploading app/config/bootstrap.php
remote: INFO: Uploading app/config/core.php
remote: INFO: Uploading app/config/routes.php
remote: INFO: Uploading app/controllers/components/email.php
remote: INFO: Uploading app/controllers/comentarios_controller.php
remote: Traceback (most recent call last):
remote: File "/home/git/git-ftp/git-ftp.py", line 311, in
remote: main()
remote: File "/home/git/git-ftp/git-ftp.py", line 88, in main
remote: upload_all(tree, ftp)
remote: File "/home/git/git-ftp/git-ftp.py", line 217, in upload_all
remote: upload_all(subtree, ftp)
remote: File "/home/git/git-ftp/git-ftp.py", line 217, in upload_all
remote: upload_all(subtree, ftp)
remote: File "/home/git/git-ftp/git-ftp.py", line 220, in upload_all
remote: upload_blob(blob, ftp)
remote: File "/home/git/git-ftp/git-ftp.py", line 295, in upload_blob
remote: ftp.storbinary('STOR ' + blob.path, blob.data_stream)
remote: File "/usr/local/lib/python2.7/site-packages/GitPython-0.3.1-py2.7.egg/git/objects/base.py", line 107, in data_stream
remote: return self.repo.odb.stream(self.binsha)
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/db/base.py", line 254, in stream
remote: return self._db_query(sha).stream(sha)
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/db/pack.py", line 96, in stream
remote: return entity.stream_at_index(index)
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/pack.py", line 634, in stream_at_index
remote: return self._object(None, True, index)
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/pack.py", line 577, in _object
remote: type_id, uncomp_size, data_rela_offset = pack_object_header_info(buffer(self._pack._data, offset))
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/util.py", line 211, in getattr
remote: self.set_cache(attr)
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/pack.py", line 393, in set_cache
remote: self._data = file_contents_ro_filepath(self._packpath)
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/util.py", line 174, in file_contents_ro_filepath
remote: return file_contents_ro(fd, stream, allow_mmap)
remote: File "/usr/local/lib/python2.7/site-packages/gitdb-0.5.2-py2.7-linux-x86_64.egg/gitdb/util.py", line 150, in file_contents_ro
remote: return mmap.mmap(fd, os.fstat(fd).st_size, access=mmap.ACCESS_READ)
remote: mmap.error: [Errno 12] Cannot allocate memory
remote: error: hook declined to update refs/heads/master

It's not like it try to upload a big file, just smalls php scripts. Have someone any idea?

Rename the repository?

Hello,

They is an other git-ftp https://github.com/resmo/git-ftp. This is a problem when you want to package the soft if they have the same name and do the same things.

Like
apt-get install git-ftp ##witch one I'm installing??

This is a possibility? I know some people follow this repository... but is better to do that sooner than later no? And you can add a note in the old one...

Not halting on permissions exception

When uploading all files, there could be protected files in the server. I find that halting on the exception is not acceptable. It makes more sense to continue uploading warning the user.

See: vcastellm@a8d7850

Please, tell me what you think.

In this line I find that the verbose mode should be the default option but this is a matter of taste.

I find this script very useful would like to help.

Makefile python error

Hi,

I had some problem when executing "sudo make install". The error I got was:

echo "from git import __version__\nfrom distutils.version import LooseVersion\nif LooseVersion(__version__) < '0.3.0':\n\traise ImportError('gitpython 0.3.x required.')" | python
  File "<stdin>", line 1
    from git import __version__\nfrom distutils.version import LooseVersion\nif LooseVersion(__version__) < '0.3.0':\n\traise ImportError('gitpython 0.3.x required.')
                                                                                                                                                                     ^
SyntaxError: unexpected character after line continuation character

I fixed this by creating a gitpython-check.py file with:

from git import __version__
from distutils.version import LooseVersion

if LooseVersion(__version__) < '0.3.0':
    raise ImportError('gitpython 0.3.x required.')

And replacing the line on the make file with:

python gitpython-check.py

Not sure if this was a bug, as issue with my machine or something I did wrong?

Include files are are in .gitignore

Is there any viable solution to upload specific files that are included in .gitignore? This would be useful for cases where builds need to be uploaded but not tracked by git.

Thanks

Delete file from index SHOULD NOT delete file on FTP

I removed a file from the index
git rm --cached file
and it was deleted on FTP, while it shouldn't.

--cache
Use this option to unstage and remove paths only from the index. Working tree files, whether modified or not, will be left alone.

Ignore .gitignore

Shouldn't it ignore .gitignore?

There is no need to upload that file to a FTP server.
It can also be considered a security risk, because it will probably point to important files like settings.

Untitled

Sorry, posted in the wrong place and can't seem to find a delete button.
/e

Logging option for the post-receive hook

It would be nice to have an easy way to log git-ftp.py output to a file when the script is called from a bare repository with the post-receive hook... Not only to debug possible errors, but also to record an history of the files uploaded and removed from the ftp server.

Would that be hard to implement ? How to ? Maybe we could add a configuration setting to it.

Ability to have one Branch copied to two ftp locations

It would be nice to have the ability to have one Branch copied to two ftp locations. For instance I have two forums that use the same forum software + modifications. It would be nice to be able to update them both using git-ftp.py.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.